From 0ff42c54f4b872866ad26013c0a00df679d01621 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 00:25:56 -0700 Subject: [PATCH 01/54] initial server file watching works --- eval_protocol/cli.py | 37 + eval_protocol/cli_commands/logs.py | 40 + eval_protocol/utils/__init__.py | 5 + eval_protocol/utils/logs_server.py | 233 +++ eval_protocol/utils/vite_server.py | 107 + pyproject.toml | 2 + uv.lock | 95 + vite-app/.gitignore | 26 + vite-app/index.html | 13 + vite-app/package.json | 30 + vite-app/pnpm-lock.yaml | 3052 ++++++++++++++++++++++++++++ vite-app/src/App.tsx | 83 + vite-app/src/main.tsx | 12 + vite-app/tsconfig.json | 25 + vite-app/tsconfig.node.json | 10 + vite-app/vite.config.ts | 16 + 16 files changed, 3786 insertions(+) create mode 100644 eval_protocol/cli_commands/logs.py create mode 100644 eval_protocol/utils/logs_server.py create mode 100644 eval_protocol/utils/vite_server.py create mode 100644 vite-app/.gitignore create mode 100644 vite-app/index.html create mode 100644 vite-app/package.json create mode 100644 vite-app/pnpm-lock.yaml create mode 100644 vite-app/src/App.tsx create mode 100644 vite-app/src/main.tsx create mode 100644 vite-app/tsconfig.json create mode 100644 vite-app/tsconfig.node.json create mode 100644 vite-app/vite.config.ts diff --git a/eval_protocol/cli.py b/eval_protocol/cli.py index 59f42a8a..efe2d996 100644 --- a/eval_protocol/cli.py +++ b/eval_protocol/cli.py @@ -14,6 +14,7 @@ logger = logging.getLogger(__name__) + from eval_protocol.evaluation import create_evaluation, preview_evaluation from .cli_commands.agent_eval_cmd import agent_eval_command @@ -26,6 +27,7 @@ from .cli_commands.deploy_mcp import deploy_mcp_command from .cli_commands.preview import preview_command from .cli_commands.run_eval_cmd import hydra_cli_entry_point +from .cli_commands.logs import logs_command def parse_args(args=None): @@ -285,6 +287,39 @@ def parse_args(args=None): help="Override the number of parallel rollouts to execute for each task.", ) + # Logs command + logs_parser = subparsers.add_parser("logs", help="Serve logs with file watching and real-time updates") + logs_parser.add_argument( + "--build-dir", + default="dist", + help="Path to the Vite build output directory (default: dist)", + ) + logs_parser.add_argument( + "--host", + default="localhost", + help="Host to bind the server to (default: localhost)", + ) + logs_parser.add_argument( + "--port", + type=int, + default=4789, + help="Port to bind the server to (default: 4789)", + ) + logs_parser.add_argument( + "--index-file", + default="index.html", + help="Name of the main index file (default: index.html)", + ) + logs_parser.add_argument( + "--watch-paths", + help="Comma-separated list of paths to watch for file changes (default: current directory)", + ) + logs_parser.add_argument( + "--reload", + action="store_true", + help="Enable auto-reload (default: False)", + ) + # Run command (for Hydra-based evaluations) # This subparser intentionally defines no arguments itself. # All arguments after 'run' will be passed to Hydra by parse_known_args. @@ -338,6 +373,8 @@ def main(): return deploy_mcp_command(args) elif args.command == "agent-eval": return agent_eval_command(args) + elif args.command == "logs": + return logs_command(args) elif args.command == "run": # For the 'run' command, Hydra takes over argument parsing. diff --git a/eval_protocol/cli_commands/logs.py b/eval_protocol/cli_commands/logs.py new file mode 100644 index 00000000..66c3e57b --- /dev/null +++ b/eval_protocol/cli_commands/logs.py @@ -0,0 +1,40 @@ +""" +CLI command for serving logs with file watching and real-time updates. +""" + +import sys +from pathlib import Path + +from ..utils.logs_server import serve_logs + + +def logs_command(args): + """Serve logs with file watching and real-time updates""" + + # Parse watch paths + watch_paths = None + if args.watch_paths: + watch_paths = args.watch_paths.split(",") + watch_paths = [path.strip() for path in watch_paths if path.strip()] + + print(f"🚀 Starting Eval Protocol Logs Server") + print(f"🌐 URL: http://{args.host}:{args.port}") + print(f"🔌 WebSocket: ws://{args.host}:{args.port}/ws") + print(f"👀 Watching paths: {watch_paths or ['current directory']}") + print("Press Ctrl+C to stop the server") + print("-" * 50) + + try: + serve_logs( + host=args.host, + port=args.port, + watch_paths=watch_paths, + reload=args.reload, + ) + return 0 + except KeyboardInterrupt: + print("\n🛑 Server stopped by user") + return 0 + except Exception as e: + print(f"❌ Error starting server: {e}") + return 1 diff --git a/eval_protocol/utils/__init__.py b/eval_protocol/utils/__init__.py index 73f2a256..1baedea2 100644 --- a/eval_protocol/utils/__init__.py +++ b/eval_protocol/utils/__init__.py @@ -6,3 +6,8 @@ # For now, allow direct import of modules like: # from eval_protocol.utils.dataset_helpers import ... + +# Export ViteServer for easier access +from .logs_server import LogsServer + +__all__ = ["LogsServer"] diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py new file mode 100644 index 00000000..0780ab5e --- /dev/null +++ b/eval_protocol/utils/logs_server.py @@ -0,0 +1,233 @@ +import asyncio +import json +import logging +import os +import time +from pathlib import Path +from typing import Dict, List, Optional, Set +from watchdog.events import FileSystemEventHandler, FileSystemEvent +from watchdog.observers import Observer + +import uvicorn +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse + +from .vite_server import ViteServer + +logger = logging.getLogger(__name__) + + +class FileWatcher(FileSystemEventHandler): + """File system watcher that tracks file changes.""" + + def __init__(self, websocket_manager): + self.websocket_manager = websocket_manager + self.ignored_patterns = { + ".git", + "__pycache__", + ".pytest_cache", + "node_modules", + ".DS_Store", + "*.pyc", + "*.pyo", + "*.pyd", + ".coverage", + "*.log", + "*.tmp", + "*.swp", + "*.swo", + "*~", + } + + def should_ignore(self, path: str) -> bool: + """Check if a path should be ignored.""" + path_lower = path.lower() + for pattern in self.ignored_patterns: + if pattern.startswith("*"): + if path_lower.endswith(pattern[1:]): + return True + elif pattern in path_lower: + return True + return False + + def on_created(self, event: FileSystemEvent): + if not event.is_directory and not self.should_ignore(event.src_path): + self.websocket_manager.broadcast_file_update("file_created", event.src_path) + + def on_modified(self, event: FileSystemEvent): + if not event.is_directory and not self.should_ignore(event.src_path): + self.websocket_manager.broadcast_file_update("file_changed", event.src_path) + + def on_deleted(self, event: FileSystemEvent): + if not event.is_directory and not self.should_ignore(event.src_path): + self.websocket_manager.broadcast_file_update("file_deleted", event.src_path) + + +class WebSocketManager: + """Manages WebSocket connections and broadcasts messages.""" + + def __init__(self): + self.active_connections: List[WebSocket] = [] + self._loop = None + + async def connect(self, websocket: WebSocket): + await websocket.accept() + self.active_connections.append(websocket) + logger.info(f"WebSocket connected. Total connections: {len(self.active_connections)}") + + def disconnect(self, websocket: WebSocket): + if websocket in self.active_connections: + self.active_connections.remove(websocket) + logger.info(f"WebSocket disconnected. Total connections: {len(self.active_connections)}") + + def broadcast_file_update(self, update_type: str, file_path: str): + """Broadcast file update to all connected clients.""" + message = {"type": update_type, "path": file_path, "timestamp": time.time()} + json_message = json.dumps(message) + + # Broadcast to all active connections + for connection in self.active_connections: + try: + asyncio.run_coroutine_threadsafe(connection.send_text(json_message), self._loop) + except Exception as e: + logger.error(f"Failed to send message to WebSocket: {e}") + # Remove broken connection + self.active_connections.remove(connection) + + +class LogsServer(ViteServer): + """ + Enhanced server for serving Vite-built SPA with file watching and WebSocket support. + + This server extends ViteServer to add: + - File system watching + - WebSocket connections for real-time updates + - Live log streaming + """ + + def __init__( + self, + build_dir: str = os.path.abspath( + os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "vite-app", "dist") + ), + host: str = "localhost", + port: int = 4789, + index_file: str = "index.html", + watch_paths: Optional[List[str]] = None, + ): + super().__init__(build_dir, host, port, index_file) + + # Initialize WebSocket manager + self.websocket_manager = WebSocketManager() + + # Set up file watching + self.watch_paths = watch_paths or [os.getcwd()] + self.observer = Observer() + self.file_watcher = FileWatcher(self.websocket_manager) + + # Add WebSocket endpoint + self._setup_websocket_routes() + + logger.info(f"LogsServer initialized on {host}:{port}") + logger.info(f"Watching paths: {self.watch_paths}") + + def _setup_websocket_routes(self): + """Set up WebSocket routes for real-time communication.""" + + @self.app.websocket("/ws") + async def websocket_endpoint(websocket: WebSocket): + await self.websocket_manager.connect(websocket) + try: + while True: + # Keep connection alive + await websocket.receive_text() + except WebSocketDisconnect: + self.websocket_manager.disconnect(websocket) + except Exception as e: + logger.error(f"WebSocket error: {e}") + self.websocket_manager.disconnect(websocket) + + @self.app.get("/api/status") + async def status(): + """Get server status including active connections.""" + return { + "status": "ok", + "build_dir": str(self.build_dir), + "active_connections": len(self.websocket_manager.active_connections), + "watch_paths": self.watch_paths, + } + + def start_file_watching(self): + """Start watching file system for changes.""" + for path in self.watch_paths: + if os.path.exists(path): + self.observer.schedule(self.file_watcher, path, recursive=True) + logger.info(f"Started watching: {path}") + else: + logger.warning(f"Watch path does not exist: {path}") + + self.observer.start() + logger.info("File watching started") + + def stop_file_watching(self): + """Stop watching file system.""" + self.observer.stop() + self.observer.join() + logger.info("File watching stopped") + + async def run_async(self, reload: bool = False): + """ + Run the logs server asynchronously with file watching. + + Args: + reload: Whether to enable auto-reload (default: False) + """ + try: + # Start file watching + self.start_file_watching() + + logger.info(f"Starting LogsServer on {self.host}:{self.port}") + logger.info(f"Serving files from: {self.build_dir}") + logger.info("WebSocket endpoint available at /ws") + + # Store the event loop for WebSocket manager + self.websocket_manager._loop = asyncio.get_running_loop() + + config = uvicorn.Config(self.app, host=self.host, port=self.port, reload=reload, log_level="info") + server = uvicorn.Server(config) + await server.serve() + except KeyboardInterrupt: + logger.info("Shutting down LogsServer...") + finally: + self.stop_file_watching() + + def run(self, reload: bool = False): + """ + Run the logs server with file watching. + + Args: + reload: Whether to enable auto-reload (default: False) + """ + asyncio.run(self.run_async(reload)) + + +def serve_logs( + host: str = "localhost", + port: int = 4789, + watch_paths: Optional[List[str]] = None, + reload: bool = False, +): + """ + Convenience function to create and run a LogsServer. + + Args: + build_dir: Path to the Vite build output directory + host: Host to bind the server to + port: Port to bind the server to (default: 4789 for logs) + index_file: Name of the main index file + watch_paths: List of paths to watch for file changes + reload: Whether to enable auto-reload + """ + server = LogsServer(host=host, port=port, watch_paths=watch_paths) + server.run(reload=reload) diff --git a/eval_protocol/utils/vite_server.py b/eval_protocol/utils/vite_server.py new file mode 100644 index 00000000..08a60097 --- /dev/null +++ b/eval_protocol/utils/vite_server.py @@ -0,0 +1,107 @@ +import os +import logging +from pathlib import Path +from typing import Optional + +import uvicorn +from fastapi import FastAPI, HTTPException +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse + +logger = logging.getLogger(__name__) + + +class ViteServer: + """ + Server for serving Vite-built SPA applications. + + This class creates a FastAPI server that serves static files from a Vite build output + directory (typically 'dist'). It handles SPA routing by serving index.html for + non-existent routes. + + Args: + build_dir: Path to the Vite build output directory (default: "dist") + host: Host to bind the server to (default: "localhost") + port: Port to bind the server to (default: 8000) + index_file: Name of the main index file (default: "index.html") + """ + + def __init__( + self, build_dir: str = "dist", host: str = "localhost", port: int = 8000, index_file: str = "index.html" + ): + self.build_dir = Path(build_dir) + self.host = host + self.port = port + self.index_file = index_file + self.app = FastAPI(title="Vite SPA Server") + + # Validate build directory exists + if not self.build_dir.exists(): + raise FileNotFoundError(f"Build directory '{self.build_dir}' does not exist") + + if not self.build_dir.is_dir(): + raise NotADirectoryError(f"'{self.build_dir}' is not a directory") + + # Check if index.html exists + index_path = self.build_dir / self.index_file + if not index_path.exists(): + raise FileNotFoundError(f"Index file '{index_path}' does not exist") + + logger.info(f"Initialized Vite server for build directory: {self.build_dir}") + + # Setup routes + self._setup_routes() + + def _setup_routes(self): + """Set up the API routes for serving the SPA.""" + + # Mount static files + self.app.mount("/assets", StaticFiles(directory=self.build_dir / "assets"), name="assets") + + # Serve other static files from build directory + @self.app.get("/{path:path}") + async def serve_spa(path: str): + """ + Serve the SPA application. + + For existing files, serve them directly. For non-existent routes, + serve index.html to enable client-side routing. + """ + file_path = self.build_dir / path + + # If the file exists, serve it + if file_path.exists() and file_path.is_file(): + return FileResponse(file_path) + + # For SPA routing, serve index.html for non-existent routes + # but exclude API routes and asset requests + if not path.startswith(("api/", "assets/")): + index_path = self.build_dir / self.index_file + if index_path.exists(): + return FileResponse(index_path) + + # If we get here, the file doesn't exist and it's not a SPA route + raise HTTPException(status_code=404, detail="File not found") + + @self.app.get("/") + async def root(): + """Serve the main index.html file.""" + index_path = self.build_dir / self.index_file + return FileResponse(index_path) + + @self.app.get("/health") + async def health(): + """Health check endpoint.""" + return {"status": "ok", "build_dir": str(self.build_dir)} + + def run(self, reload: bool = False): + """ + Run the Vite server. + + Args: + reload: Whether to enable auto-reload (default: False) + """ + logger.info(f"Starting Vite server on {self.host}:{self.port}") + logger.info(f"Serving files from: {self.build_dir}") + + uvicorn.run(self.app, host=self.host, port=self.port, reload=reload, log_level="info") diff --git a/pyproject.toml b/pyproject.toml index fce3cbd7..a7277658 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,8 @@ dependencies = [ "addict>=2.4.0", "deepdiff>=6.0.0", "pandas>=1.5.0", + "watchdog>=2.1.0", + "websockets>=15.0.1", ] [project.urls] diff --git a/uv.lock b/uv.lock index 7738a5c3..22e77fd9 100644 --- a/uv.lock +++ b/uv.lock @@ -1150,6 +1150,8 @@ dependencies = [ { name = "rich" }, { name = "toml" }, { name = "uvicorn" }, + { name = "watchdog" }, + { name = "websockets" }, ] [package.optional-dependencies] @@ -1293,6 +1295,8 @@ requires-dist = [ { name = "types-setuptools", marker = "extra == 'dev'" }, { name = "uvicorn", specifier = ">=0.15.0" }, { name = "versioneer", marker = "extra == 'dev'", specifier = ">=0.20" }, + { name = "watchdog", specifier = ">=2.1.0" }, + { name = "websockets", specifier = ">=15.0.1" }, { name = "werkzeug", marker = "extra == 'dev'", specifier = ">=2.0.0" }, ] provides-extras = ["dev", "trl", "openevals", "fireworks", "box2d", "langfuse", "huggingface", "adapters"] @@ -5767,6 +5771,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/c6/f8f28009920a736d0df434b52e9feebfb4d702ba942f15338cb4a83eafc1/virtualenv-20.32.0-py3-none-any.whl", hash = "sha256:2c310aecb62e5aa1b06103ed7c2977b81e042695de2697d01017ff0f1034af56", size = 6057761, upload-time = "2025-07-21T04:09:48.059Z" }, ] +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] + [[package]] name = "wcwidth" version = "0.2.13" @@ -5803,6 +5839,65 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload-time = "2024-04-23T22:16:14.422Z" }, ] +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/da/6462a9f510c0c49837bbc9345aca92d767a56c1fb2939e1579df1e1cdcf7/websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", size = 175423, upload-time = "2025-03-05T20:01:35.363Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9f/9d11c1a4eb046a9e106483b9ff69bce7ac880443f00e5ce64261b47b07e7/websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", size = 173080, upload-time = "2025-03-05T20:01:37.304Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4f/b462242432d93ea45f297b6179c7333dd0402b855a912a04e7fc61c0d71f/websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", size = 173329, upload-time = "2025-03-05T20:01:39.668Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0c/6afa1f4644d7ed50284ac59cc70ef8abd44ccf7d45850d989ea7310538d0/websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", size = 182312, upload-time = "2025-03-05T20:01:41.815Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d4/ffc8bd1350b229ca7a4db2a3e1c482cf87cea1baccd0ef3e72bc720caeec/websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", size = 181319, upload-time = "2025-03-05T20:01:43.967Z" }, + { url = "https://files.pythonhosted.org/packages/97/3a/5323a6bb94917af13bbb34009fac01e55c51dfde354f63692bf2533ffbc2/websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", size = 181631, upload-time = "2025-03-05T20:01:46.104Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cc/1aeb0f7cee59ef065724041bb7ed667b6ab1eeffe5141696cccec2687b66/websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", size = 182016, upload-time = "2025-03-05T20:01:47.603Z" }, + { url = "https://files.pythonhosted.org/packages/79/f9/c86f8f7af208e4161a7f7e02774e9d0a81c632ae76db2ff22549e1718a51/websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", size = 181426, upload-time = "2025-03-05T20:01:48.949Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b9/828b0bc6753db905b91df6ae477c0b14a141090df64fb17f8a9d7e3516cf/websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", size = 181360, upload-time = "2025-03-05T20:01:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/89/fb/250f5533ec468ba6327055b7d98b9df056fb1ce623b8b6aaafb30b55d02e/websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", size = 176388, upload-time = "2025-03-05T20:01:52.213Z" }, + { url = "https://files.pythonhosted.org/packages/1c/46/aca7082012768bb98e5608f01658ff3ac8437e563eca41cf068bd5849a5e/websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", size = 176830, upload-time = "2025-03-05T20:01:53.922Z" }, + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/d40f779fa16f74d3468357197af8d6ad07e7c5a27ea1ca74ceb38986f77a/websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", size = 173109, upload-time = "2025-03-05T20:03:17.769Z" }, + { url = "https://files.pythonhosted.org/packages/bc/cd/5b887b8585a593073fd92f7c23ecd3985cd2c3175025a91b0d69b0551372/websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", size = 173343, upload-time = "2025-03-05T20:03:19.094Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ae/d34f7556890341e900a95acf4886833646306269f899d58ad62f588bf410/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", size = 174599, upload-time = "2025-03-05T20:03:21.1Z" }, + { url = "https://files.pythonhosted.org/packages/71/e6/5fd43993a87db364ec60fc1d608273a1a465c0caba69176dd160e197ce42/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", size = 174207, upload-time = "2025-03-05T20:03:23.221Z" }, + { url = "https://files.pythonhosted.org/packages/2b/fb/c492d6daa5ec067c2988ac80c61359ace5c4c674c532985ac5a123436cec/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", size = 174155, upload-time = "2025-03-05T20:03:25.321Z" }, + { url = "https://files.pythonhosted.org/packages/68/a1/dcb68430b1d00b698ae7a7e0194433bce4f07ded185f0ee5fb21e2a2e91e/websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", size = 176884, upload-time = "2025-03-05T20:03:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + [[package]] name = "werkzeug" version = "3.1.3" diff --git a/vite-app/.gitignore b/vite-app/.gitignore new file mode 100644 index 00000000..0999a5ea --- /dev/null +++ b/vite-app/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +!package.json \ No newline at end of file diff --git a/vite-app/index.html b/vite-app/index.html new file mode 100644 index 00000000..24125e83 --- /dev/null +++ b/vite-app/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite SPA Example + + +
+ + + \ No newline at end of file diff --git a/vite-app/package.json b/vite-app/package.json new file mode 100644 index 00000000..fad821b5 --- /dev/null +++ b/vite-app/package.json @@ -0,0 +1,30 @@ +{ + "name": "vite-spa-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.8.1" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^3.1.0", + "eslint": "^8.38.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.2.0" + } +} diff --git a/vite-app/pnpm-lock.yaml b/vite-app/pnpm-lock.yaml new file mode 100644 index 00000000..a3e19b57 --- /dev/null +++ b/vite-app/pnpm-lock.yaml @@ -0,0 +1,3052 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.8.1 + version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.0.28 + version: 18.3.23 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.3.7(@types/react@18.3.23) + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.62.0(eslint@8.57.1)(typescript@5.9.2) + '@vitejs/plugin-react': + specifier: ^3.1.0 + version: 3.1.0(vite@4.5.14) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-plugin-react: + specifier: ^7.32.2 + version: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.3.4 + version: 0.3.5(eslint@8.57.1) + typescript: + specifier: ^5.0.2 + version: 5.9.2 + vite: + specifier: ^4.2.0 + version: 4.5.14 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.2': + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@remix-run/router@1.23.0': + resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} + engines: {node: '>=14.0.0'} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.23': + resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@3.1.0': + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001731: + resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.195: + resolution: {integrity: sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.3.5: + resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.30.1: + resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.30.1: + resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.28.2 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.2': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.2 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@remix-run/router@1.23.0': {} + + '@types/json-schema@7.0.15': {} + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.23)': + dependencies: + '@types/react': 18.3.23 + + '@types/react@18.3.23': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.1.3 + + '@types/semver@7.7.0': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@3.1.0(vite@4.5.14)': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + magic-string: 0.27.0 + react-refresh: 0.14.2 + vite: 4.5.14 + transitivePeerDependencies: + - supports-color + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001731 + electron-to-chromium: 1.5.195 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001731: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.195: {} + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-refresh@0.3.5(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.5(eslint@8.57.1): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.27.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.19: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@16.13.1: {} + + react-refresh@0.14.2: {} + + react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.30.1(react@18.3.1) + + react-router@6.30.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.0 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + resolve-from@4.0.0: {} + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + text-table@0.2.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@1.14.1: {} + + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.9.2: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@4.5.14: + dependencies: + esbuild: 0.18.20 + postcss: 8.5.6 + rollup: 3.29.5 + optionalDependencies: + fsevents: 2.3.3 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx new file mode 100644 index 00000000..8f821cc2 --- /dev/null +++ b/vite-app/src/App.tsx @@ -0,0 +1,83 @@ +import { useEffect, useState } from "react"; +import { Link } from "react-router-dom"; + +interface FileUpdate { + type: "file_changed" | "file_created" | "file_deleted"; + path: string; + timestamp: string; +} + +function App() { + const [isConnected, setIsConnected] = useState(false); + + useEffect(() => { + // Connect to WebSocket for file updates + const ws = new WebSocket("ws://localhost:4789/ws"); + + ws.onopen = () => { + console.log("Connected to file watcher"); + setIsConnected(true); + }; + + ws.onmessage = (event) => { + try { + const update: FileUpdate = JSON.parse(event.data); + console.log(update); + } catch (error) { + console.error("Failed to parse WebSocket message:", error); + } + }; + + ws.onclose = () => { + console.log("Disconnected from file watcher"); + setIsConnected(false); + }; + + ws.onerror = (error) => { + console.error("WebSocket error:", error); + setIsConnected(false); + }; + + return () => { + ws.close(); + }; + }, []); + + return ( +
+ + +
TODO
+
+ ); +} + +export default App; diff --git a/vite-app/src/main.tsx b/vite-app/src/main.tsx new file mode 100644 index 00000000..a9247ae6 --- /dev/null +++ b/vite-app/src/main.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import App from "./App"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/vite-app/tsconfig.json b/vite-app/tsconfig.json new file mode 100644 index 00000000..5ae1c400 --- /dev/null +++ b/vite-app/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/vite-app/tsconfig.node.json b/vite-app/tsconfig.node.json new file mode 100644 index 00000000..862dfb2b --- /dev/null +++ b/vite-app/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} \ No newline at end of file diff --git a/vite-app/vite.config.ts b/vite-app/vite.config.ts new file mode 100644 index 00000000..9cd94be7 --- /dev/null +++ b/vite-app/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'dist', + assetsDir: 'assets', + sourcemap: true + }, + server: { + port: 5173, + host: true + } +}) \ No newline at end of file From 01cc19615e4293b3a2d17c3797381c5b1e1c5032 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 00:42:19 -0700 Subject: [PATCH 02/54] save --- vite-app/eslint.config.js | 23 + vite-app/index.html | 1 + vite-app/package.json | 30 +- vite-app/pnpm-lock.yaml | 2972 ++++++++++++++--------------------- vite-app/src/App.tsx | 1 + vite-app/src/index.css | 2 + vite-app/tsconfig.app.json | 27 + vite-app/tsconfig.json | 28 +- vite-app/tsconfig.node.json | 23 +- vite-app/vite.config.ts | 3 +- 10 files changed, 1307 insertions(+), 1803 deletions(-) create mode 100644 vite-app/eslint.config.js create mode 100644 vite-app/src/index.css create mode 100644 vite-app/tsconfig.app.json diff --git a/vite-app/eslint.config.js b/vite-app/eslint.config.js new file mode 100644 index 00000000..d94e7deb --- /dev/null +++ b/vite-app/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/vite-app/index.html b/vite-app/index.html index 24125e83..5226d694 100644 --- a/vite-app/index.html +++ b/vite-app/index.html @@ -5,6 +5,7 @@ Vite SPA Example +
diff --git a/vite-app/package.json b/vite-app/package.json index fad821b5..7107464a 100644 --- a/vite-app/package.json +++ b/vite-app/package.json @@ -10,21 +10,23 @@ "preview": "vite preview" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.8.1" + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.7.1" }, "devDependencies": { - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", - "@vitejs/plugin-react": "^3.1.0", - "eslint": "^8.38.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.3.4", - "typescript": "^5.0.2", - "vite": "^4.2.0" + "@eslint/js": "^9.30.1", + "@tailwindcss/vite": "^4.1.11", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "eslint": "^9.30.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "tailwindcss": "^4.1.11", + "typescript": "~5.8.3", + "typescript-eslint": "^8.35.1", + "vite": "^7.0.4" } } diff --git a/vite-app/pnpm-lock.yaml b/vite-app/pnpm-lock.yaml index a3e19b57..77288dda 100644 --- a/vite-app/pnpm-lock.yaml +++ b/vite-app/pnpm-lock.yaml @@ -9,48 +9,54 @@ importers: .: dependencies: react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: ^19.1.0 + version: 19.1.1 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + specifier: ^19.1.0 + version: 19.1.1(react@19.1.1) react-router-dom: - specifier: ^6.8.1 - version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.7.1 + version: 7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) devDependencies: + '@eslint/js': + specifier: ^9.30.1 + version: 9.32.0 + '@tailwindcss/vite': + specifier: ^4.1.11 + version: 4.1.11(vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1)) '@types/react': - specifier: ^18.0.28 - version: 18.3.23 + specifier: ^19.1.8 + version: 19.1.9 '@types/react-dom': - specifier: ^18.0.11 - version: 18.3.7(@types/react@18.3.23) - '@typescript-eslint/eslint-plugin': - specifier: ^5.57.1 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': - specifier: ^5.57.1 - version: 5.62.0(eslint@8.57.1)(typescript@5.9.2) + specifier: ^19.1.6 + version: 19.1.7(@types/react@19.1.9) '@vitejs/plugin-react': - specifier: ^3.1.0 - version: 3.1.0(vite@4.5.14) + specifier: ^4.6.0 + version: 4.7.0(vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1)) eslint: - specifier: ^8.38.0 - version: 8.57.1 - eslint-plugin-react: - specifier: ^7.32.2 - version: 7.37.5(eslint@8.57.1) + specifier: ^9.30.1 + version: 9.32.0(jiti@2.5.1) eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + specifier: ^5.2.0 + version: 5.2.0(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-react-refresh: - specifier: ^0.3.4 - version: 0.3.5(eslint@8.57.1) + specifier: ^0.4.20 + version: 0.4.20(eslint@9.32.0(jiti@2.5.1)) + globals: + specifier: ^16.3.0 + version: 16.3.0 + tailwindcss: + specifier: ^4.1.11 + version: 4.1.11 typescript: - specifier: ^5.0.2 - version: 5.9.2 + specifier: ~5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.35.1 + version: 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) vite: - specifier: ^4.2.0 - version: 4.5.14 + specifier: ^7.0.4 + version: 7.0.6(jiti@2.5.1)(lightningcss@1.30.1) packages: @@ -141,135 +147,159 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -283,26 +313,57 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.32.0': + resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@eslint/plugin-kit@0.3.4': + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -329,93 +390,289 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@remix-run/router@1.23.0': - resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@tailwindcss/vite@4.1.11': + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} peerDependencies: - '@types/react': ^18.0.0 + vite: ^5.2.0 || ^6 || ^7 - '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/react': ^19.0.0 - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + + '@typescript-eslint/eslint-plugin@8.39.0': + resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.39.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@8.39.0': + resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/project-service@8.39.0': + resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.39.0': + resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/tsconfig-utils@8.39.0': + resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/type-utils@8.39.0': + resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@8.39.0': + resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.39.0': + resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.39.0': + resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@typescript-eslint/visitor-keys@8.39.0': + resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react@3.1.0': - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.1.0-beta.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -430,10 +687,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -441,52 +694,15 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -496,18 +712,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -519,6 +723,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -532,6 +740,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -539,18 +751,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -563,68 +763,20 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - electron-to-chromium@1.5.195: resolution: {integrity: sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -635,44 +787,42 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-refresh@0.3.5: - resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} - peerDependencies: - eslint: '>=7' + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint: '>=8.40' - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.32.0: + resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -682,10 +832,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -710,9 +856,17 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -722,51 +876,22 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -775,60 +900,32 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -837,130 +934,24 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {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. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -988,10 +979,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -999,6 +986,70 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1006,20 +1057,11 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1032,6 +1074,23 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1040,54 +1099,16 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1104,21 +1125,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1126,9 +1136,9 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} @@ -1138,9 +1148,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1148,82 +1155,54 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: - react: ^18.3.1 + react: ^19.1.1 - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@6.30.1: - resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} - engines: {node: '>=14.0.0'} + react-router-dom@7.7.1: + resolution: {integrity: sha512-bavdk2BA5r3MYalGKZ01u8PGuDBloQmzpBZVhDLrOOv1N943Wq6dcM9GhB3x8b7AbqPMEezauv4PeGkAJfy7FQ==} + engines: {node: '>=20.0.0'} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=18' + react-dom: '>=18' - react-router@6.30.1: - resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} - engines: {node: '>=14.0.0'} + react-router@7.7.1: + resolution: {integrity: sha512-jVKHXoWRIsD/qS6lvGveckwb862EekvapdHJN/cGmzw40KnJH5gg53ujOJ4qX6EKIK9LSBfFed/xiQ5yeXNrUA==} + engines: {node: '>=20.0.0'} peerDependencies: - react: '>=16.8' + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -1234,17 +1213,8 @@ packages: engines: {node: '>=10'} hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -1254,57 +1224,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -1313,59 +1236,47 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + typescript: '>=4.8.4' type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + typescript-eslint@8.39.0: + resolution: {integrity: sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -1375,49 +1286,45 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite@4.5.14: - resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} - engines: {node: ^14.18.0 || >=16.0.0} + vite@7.0.6: + resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': '>= 14' - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + tsx: + optional: true + yaml: + optional: true which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -1428,12 +1335,13 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -1557,85 +1465,111 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@esbuild/android-arm64@0.18.20': + '@esbuild/aix-ppc64@0.25.8': + optional: true + + '@esbuild/android-arm64@0.25.8': + optional: true + + '@esbuild/android-arm@0.25.8': + optional: true + + '@esbuild/android-x64@0.25.8': + optional: true + + '@esbuild/darwin-arm64@0.25.8': optional: true - '@esbuild/android-arm@0.18.20': + '@esbuild/darwin-x64@0.25.8': optional: true - '@esbuild/android-x64@0.18.20': + '@esbuild/freebsd-arm64@0.25.8': optional: true - '@esbuild/darwin-arm64@0.18.20': + '@esbuild/freebsd-x64@0.25.8': optional: true - '@esbuild/darwin-x64@0.18.20': + '@esbuild/linux-arm64@0.25.8': optional: true - '@esbuild/freebsd-arm64@0.18.20': + '@esbuild/linux-arm@0.25.8': optional: true - '@esbuild/freebsd-x64@0.18.20': + '@esbuild/linux-ia32@0.25.8': optional: true - '@esbuild/linux-arm64@0.18.20': + '@esbuild/linux-loong64@0.25.8': optional: true - '@esbuild/linux-arm@0.18.20': + '@esbuild/linux-mips64el@0.25.8': optional: true - '@esbuild/linux-ia32@0.18.20': + '@esbuild/linux-ppc64@0.25.8': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-riscv64@0.25.8': optional: true - '@esbuild/linux-mips64el@0.18.20': + '@esbuild/linux-s390x@0.25.8': optional: true - '@esbuild/linux-ppc64@0.18.20': + '@esbuild/linux-x64@0.25.8': optional: true - '@esbuild/linux-riscv64@0.18.20': + '@esbuild/netbsd-arm64@0.25.8': optional: true - '@esbuild/linux-s390x@0.18.20': + '@esbuild/netbsd-x64@0.25.8': optional: true - '@esbuild/linux-x64@0.18.20': + '@esbuild/openbsd-arm64@0.25.8': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/openbsd-x64@0.25.8': optional: true - '@esbuild/openbsd-x64@0.18.20': + '@esbuild/openharmony-arm64@0.25.8': optional: true - '@esbuild/sunos-x64@0.18.20': + '@esbuild/sunos-x64@0.25.8': optional: true - '@esbuild/win32-arm64@0.18.20': + '@esbuild/win32-arm64@0.25.8': optional: true - '@esbuild/win32-ia32@0.18.20': + '@esbuild/win32-ia32@0.25.8': optional: true - '@esbuild/win32-x64@0.18.20': + '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.5.1))': dependencies: - eslint: 8.57.1 + eslint: 9.32.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.0 @@ -1644,19 +1578,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.32.0': {} - '@humanwhocodes/config-array@0.13.0': + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.4': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/core': 0.15.1 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 '@jridgewell/gen-mapping@0.3.12': dependencies: @@ -1684,205 +1630,295 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@remix-run/router@1.23.0': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} - '@types/json-schema@7.0.15': {} + '@rollup/rollup-android-arm-eabi@4.46.2': + optional: true - '@types/prop-types@15.7.15': {} + '@rollup/rollup-android-arm64@4.46.2': + optional: true - '@types/react-dom@18.3.7(@types/react@18.3.23)': - dependencies: - '@types/react': 18.3.23 + '@rollup/rollup-darwin-arm64@4.46.2': + optional: true - '@types/react@18.3.23': - dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + '@rollup/rollup-darwin-x64@4.46.2': + optional: true - '@types/semver@7.7.0': {} + '@rollup/rollup-freebsd-arm64@4.46.2': + optional: true - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) - debug: 4.4.1 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.2 - tsutils: 3.21.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-freebsd-x64@4.46.2': + optional: true - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) - debug: 4.4.1 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + optional: true - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + optional: true - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) - debug: 4.4.1 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-linux-arm64-gnu@4.46.2': + optional: true - '@typescript-eslint/types@5.62.0': {} + '@rollup/rollup-linux-arm64-musl@4.46.2': + optional: true - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.2 - tsutils: 3.21.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + optional: true - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - typescript + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + optional: true - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + optional: true - '@ungap/structured-clone@1.3.0': {} + '@rollup/rollup-linux-riscv64-musl@4.46.2': + optional: true - '@vitejs/plugin-react@3.1.0(vite@4.5.14)': - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - magic-string: 0.27.0 - react-refresh: 0.14.2 - vite: 4.5.14 - transitivePeerDependencies: - - supports-color + '@rollup/rollup-linux-s390x-gnu@4.46.2': + optional: true - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 + '@rollup/rollup-linux-x64-gnu@4.46.2': + optional: true - acorn@8.15.0: {} + '@rollup/rollup-linux-x64-musl@4.46.2': + optional: true - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + '@rollup/rollup-win32-arm64-msvc@4.46.2': + optional: true - ansi-regex@5.0.1: {} + '@rollup/rollup-win32-ia32-msvc@4.46.2': + optional: true - ansi-styles@4.3.0: + '@rollup/rollup-win32-x64-msvc@4.46.2': + optional: true + + '@tailwindcss/node@4.1.11': dependencies: - color-convert: 2.0.1 + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.2 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 - argparse@2.0.1: {} + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/vite@4.1.11(vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 7.0.6(jiti@2.5.1)(lightningcss@1.30.1) + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/react-dom@19.1.7(@types/react@19.1.9)': + dependencies: + '@types/react': 19.1.9 + + '@types/react@19.1.9': + dependencies: + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.39.0 + eslint: 9.32.0(jiti@2.5.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.39.0 + debug: 4.4.1 + eslint: 9.32.0(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.39.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) + '@typescript-eslint/types': 8.39.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - array-buffer-byte-length@1.0.2: + '@typescript-eslint/scope-manager@8.39.0': dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/visitor-keys': 8.39.0 - array-includes@3.1.9: + '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.8.3)': dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 + typescript: 5.8.3 - array-union@2.1.0: {} + '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.32.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.39.0': {} - array.prototype.findlast@1.2.5: + '@typescript-eslint/typescript-estree@8.39.0(typescript@5.8.3)': dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + '@typescript-eslint/project-service': 8.39.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/visitor-keys': 8.39.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - array.prototype.flat@1.3.3: + '@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.39.0 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) + eslint: 9.32.0(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - array.prototype.flatmap@1.3.3: + '@typescript-eslint/visitor-keys@8.39.0': dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 + '@typescript-eslint/types': 8.39.0 + eslint-visitor-keys: 4.2.1 - array.prototype.tosorted@1.1.4: + '@vitejs/plugin-react@4.7.0(vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1))': dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.0.6(jiti@2.5.1)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color - arraybuffer.prototype.slice@1.0.4: + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 + acorn: 8.15.0 - async-function@1.0.0: {} + acorn@8.15.0: {} - available-typed-arrays@1.0.7: + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: dependencies: - possible-typed-array-names: 1.1.0 + color-convert: 2.0.1 + + argparse@2.0.1: {} balanced-match@1.0.2: {} @@ -1891,6 +1927,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -1902,23 +1942,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} caniuse-lite@1.0.30001731: {} @@ -1928,6 +1951,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chownr@3.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1938,6 +1963,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@1.0.2: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1946,282 +1973,118 @@ snapshots: csstype@3.1.3: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - debug@4.4.1: dependencies: ms: 2.1.3 deep-is@0.1.4: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 + detect-libc@2.0.4: {} - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 + electron-to-chromium@1.5.195: {} - dunder-proto@1.0.1: + enhanced-resolve@5.18.2: dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - electron-to-chromium@1.5.195: {} + graceful-fs: 4.2.11 + tapable: 2.2.2 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - esbuild@0.18.20: + esbuild@0.25.8: optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.5.1)): dependencies: - eslint: 8.57.1 + eslint: 9.32.0(jiti@2.5.1) - eslint-plugin-react-refresh@0.3.5(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.20(eslint@9.32.0(jiti@2.5.1)): dependencies: - eslint: 8.57.1 + eslint: 9.32.0(jiti@2.5.1) - eslint-plugin-react@7.37.5(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint-visitor-keys@4.2.1: {} + + eslint@9.32.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.32.0 + '@eslint/plugin-kit': 0.3.4 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.1 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.5.1 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: @@ -2231,8 +2094,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} esutils@2.0.3: {} @@ -2255,9 +2116,13 @@ snapshots: dependencies: reusify: 1.1.0 - file-entry-cache@6.0.1: + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -2268,62 +2133,18 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.3: {} - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2332,61 +2153,20 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + globals@14.0.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@16.3.0: {} - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} - has-bigints@1.1.0: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -2394,140 +2174,17 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-path-inside@3.0.3: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - isarray@2.0.5: {} - isexe@2.0.0: {} - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 + jiti@2.5.1: {} js-tokens@4.0.0: {} @@ -2545,13 +2202,6 @@ snapshots: json5@2.2.3: {} - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -2561,26 +2211,65 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.merge@4.6.2: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lru-cache@5.1.1: dependencies: yallist: 3.1.1 - magic-string@0.27.0: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 - math-intrinsics@1.1.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -2592,55 +2281,25 @@ snapshots: dependencies: brace-expansion: 1.1.12 - ms@2.1.3: {} - - nanoid@3.3.11: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - node-releases@2.0.19: {} - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 - object-keys@1.1.1: {} + minipass@7.1.2: {} - object.assign@4.1.7: + minizlib@3.0.2: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 + minipass: 7.1.2 - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + mkdirp@3.0.1: {} - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + ms@2.1.3: {} - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + nanoid@3.3.11: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 + natural-compare@1.4.0: {} + + node-releases@2.0.19: {} optionator@0.9.4: dependencies: @@ -2651,12 +2310,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -2671,19 +2324,13 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} - - path-type@4.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} - possible-typed-array-names@1.1.0: {} + picomatch@4.0.3: {} postcss@8.5.6: dependencies: @@ -2693,132 +2340,74 @@ snapshots: prelude-ls@1.2.1: {} - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - punycode@2.3.1: {} queue-microtask@1.2.3: {} - react-dom@18.3.1(react@18.3.1): + react-dom@19.1.1(react@19.1.1): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.1.1 + scheduler: 0.26.0 - react-is@16.13.1: {} - - react-refresh@0.14.2: {} - - react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@remix-run/router': 1.23.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.1(react@18.3.1) + react-refresh@0.17.0: {} - react-router@6.30.1(react@18.3.1): + react-router-dom@7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@remix-run/router': 1.23.0 - react: 18.3.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-router: 7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react@18.3.1: + react-router@7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - loose-envify: 1.4.0 + cookie: 1.0.2 + react: 19.1.1 + set-cookie-parser: 2.7.1 + optionalDependencies: + react-dom: 19.1.1(react@19.1.1) - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 + react@19.1.1: {} resolve-from@4.0.0: {} - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - rimraf@3.0.2: + rollup@4.46.2: dependencies: - glob: 7.2.3 - - rollup@3.29.5: + '@types/estree': 1.0.8 optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.26.0: {} semver@6.3.1: {} semver@7.7.2: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + set-cookie-parser@2.7.1: {} shebang-command@2.0.0: dependencies: @@ -2826,159 +2415,56 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - slash@3.0.0: {} - source-map-js@1.2.1: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 + strip-json-comments@3.1.1: {} - string.prototype.repeat@1.0.0: + supports-color@7.2.0: dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 + has-flag: 4.0.0 - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 + tailwindcss@4.1.11: {} - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + tapable@2.2.2: {} - string.prototype.trimstart@1.0.8: + tar@7.4.3: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 - strip-ansi@6.0.1: + tinyglobby@0.2.14: dependencies: - ansi-regex: 5.0.1 - - strip-json-comments@3.1.1: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - text-table@0.2.0: {} + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tslib@1.14.1: {} - - tsutils@3.21.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - tslib: 1.14.1 - typescript: 5.9.2 + typescript: 5.8.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - - typed-array-buffer@1.0.3: + typescript-eslint@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3): dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typescript@5.9.2: {} + '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.32.0(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 + typescript@5.8.3: {} update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: @@ -2990,54 +2476,18 @@ snapshots: dependencies: punycode: 2.3.1 - vite@4.5.14: + vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1): dependencies: - esbuild: 0.18.20 + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 3.29.5 + rollup: 4.46.2 + tinyglobby: 0.2.14 optionalDependencies: fsevents: 2.3.3 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 + jiti: 2.5.1 + lightningcss: 1.30.1 which@2.0.2: dependencies: @@ -3045,8 +2495,8 @@ snapshots: word-wrap@1.2.5: {} - wrappy@1.0.2: {} - yallist@3.1.1: {} + yallist@5.0.0: {} + yocto-queue@0.1.0: {} diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 8f821cc2..e257adf1 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; +import "./index.css"; interface FileUpdate { type: "file_changed" | "file_created" | "file_deleted"; diff --git a/vite-app/src/index.css b/vite-app/src/index.css new file mode 100644 index 00000000..022157d5 --- /dev/null +++ b/vite-app/src/index.css @@ -0,0 +1,2 @@ + +@import "tailwindcss"; \ No newline at end of file diff --git a/vite-app/tsconfig.app.json b/vite-app/tsconfig.app.json new file mode 100644 index 00000000..227a6c67 --- /dev/null +++ b/vite-app/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/vite-app/tsconfig.json b/vite-app/tsconfig.json index 5ae1c400..1ffef600 100644 --- a/vite-app/tsconfig.json +++ b/vite-app/tsconfig.json @@ -1,25 +1,7 @@ { - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/vite-app/tsconfig.node.json b/vite-app/tsconfig.node.json index 862dfb2b..f85a3990 100644 --- a/vite-app/tsconfig.node.json +++ b/vite-app/tsconfig.node.json @@ -1,10 +1,25 @@ { "compilerOptions": { - "composite": true, - "skipLibCheck": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true }, "include": ["vite.config.ts"] -} \ No newline at end of file +} diff --git a/vite-app/vite.config.ts b/vite-app/vite.config.ts index 9cd94be7..78f64d17 100644 --- a/vite-app/vite.config.ts +++ b/vite-app/vite.config.ts @@ -1,9 +1,10 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), tailwindcss()], build: { outDir: 'dist', assetsDir: 'assets', From c7ee212106b2739fc6e8dec66600b03ba4f15396 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 00:46:26 -0700 Subject: [PATCH 03/54] fix error --- vite-app/src/App.tsx | 1 - vite-app/src/main.tsx | 1 + vite-app/src/typings.d.ts | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 vite-app/src/typings.d.ts diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index e257adf1..8f821cc2 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -1,6 +1,5 @@ import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; -import "./index.css"; interface FileUpdate { type: "file_changed" | "file_created" | "file_deleted"; diff --git a/vite-app/src/main.tsx b/vite-app/src/main.tsx index a9247ae6..fe05248c 100644 --- a/vite-app/src/main.tsx +++ b/vite-app/src/main.tsx @@ -2,6 +2,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; +import "./index.css"; ReactDOM.createRoot(document.getElementById("root")!).render( diff --git a/vite-app/src/typings.d.ts b/vite-app/src/typings.d.ts new file mode 100644 index 00000000..2cee4606 --- /dev/null +++ b/vite-app/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module '*.css' { + const content: Record; + export default content; +} \ No newline at end of file From 33e2663c4f7b6bf20094fa9efd9d33109f3c4337 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 00:49:42 -0700 Subject: [PATCH 04/54] include dist/ as part of production packaging --- vite-app/.gitignore | 4 +- vite-app/dist/assets/index-BqeSuXV9.js | 61 ++++++++++++++++++++++ vite-app/dist/assets/index-BqeSuXV9.js.map | 1 + vite-app/dist/assets/index-DFYonil9.css | 1 + vite-app/dist/index.html | 14 +++++ 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 vite-app/dist/assets/index-BqeSuXV9.js create mode 100644 vite-app/dist/assets/index-BqeSuXV9.js.map create mode 100644 vite-app/dist/assets/index-DFYonil9.css create mode 100644 vite-app/dist/index.html diff --git a/vite-app/.gitignore b/vite-app/.gitignore index 0999a5ea..9b89d067 100644 --- a/vite-app/.gitignore +++ b/vite-app/.gitignore @@ -8,7 +8,6 @@ pnpm-debug.log* lerna-debug.log* node_modules -dist dist-ssr *.local @@ -23,4 +22,5 @@ dist-ssr *.sln *.sw? -!package.json \ No newline at end of file +!package.json +!dist/ \ No newline at end of file diff --git a/vite-app/dist/assets/index-BqeSuXV9.js b/vite-app/dist/assets/index-BqeSuXV9.js new file mode 100644 index 00000000..b11e4e26 --- /dev/null +++ b/vite-app/dist/assets/index-BqeSuXV9.js @@ -0,0 +1,61 @@ +(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const h of document.querySelectorAll('link[rel="modulepreload"]'))r(h);new MutationObserver(h=>{for(const S of h)if(S.type==="childList")for(const R of S.addedNodes)R.tagName==="LINK"&&R.rel==="modulepreload"&&r(R)}).observe(document,{childList:!0,subtree:!0});function d(h){const S={};return h.integrity&&(S.integrity=h.integrity),h.referrerPolicy&&(S.referrerPolicy=h.referrerPolicy),h.crossOrigin==="use-credentials"?S.credentials="include":h.crossOrigin==="anonymous"?S.credentials="omit":S.credentials="same-origin",S}function r(h){if(h.ep)return;h.ep=!0;const S=d(h);fetch(h.href,S)}})();function Xd(f){return f&&f.__esModule&&Object.prototype.hasOwnProperty.call(f,"default")?f.default:f}var gc={exports:{}},zu={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var zd;function Rv(){if(zd)return zu;zd=1;var f=Symbol.for("react.transitional.element"),o=Symbol.for("react.fragment");function d(r,h,S){var R=null;if(S!==void 0&&(R=""+S),h.key!==void 0&&(R=""+h.key),"key"in h){S={};for(var N in h)N!=="key"&&(S[N]=h[N])}else S=h;return h=S.ref,{$$typeof:f,type:r,key:R,ref:h!==void 0?h:null,props:S}}return zu.Fragment=o,zu.jsx=d,zu.jsxs=d,zu}var Od;function zv(){return Od||(Od=1,gc.exports=Rv()),gc.exports}var wt=zv(),Sc={exports:{}},I={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Md;function Ov(){if(Md)return I;Md=1;var f=Symbol.for("react.transitional.element"),o=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),S=Symbol.for("react.consumer"),R=Symbol.for("react.context"),N=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),m=Symbol.for("react.memo"),M=Symbol.for("react.lazy"),H=Symbol.iterator;function C(v){return v===null||typeof v!="object"?null:(v=H&&v[H]||v["@@iterator"],typeof v=="function"?v:null)}var k={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Q=Object.assign,j={};function Z(v,x,G){this.props=v,this.context=x,this.refs=j,this.updater=G||k}Z.prototype.isReactComponent={},Z.prototype.setState=function(v,x){if(typeof v!="object"&&typeof v!="function"&&v!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,v,x,"setState")},Z.prototype.forceUpdate=function(v){this.updater.enqueueForceUpdate(this,v,"forceUpdate")};function Y(){}Y.prototype=Z.prototype;function nt(v,x,G){this.props=v,this.context=x,this.refs=j,this.updater=G||k}var P=nt.prototype=new Y;P.constructor=nt,Q(P,Z.prototype),P.isPureReactComponent=!0;var bt=Array.isArray,W={H:null,A:null,T:null,S:null,V:null},xt=Object.prototype.hasOwnProperty;function Dt(v,x,G,B,V,it){return G=it.ref,{$$typeof:f,type:v,key:x,ref:G!==void 0?G:null,props:it}}function Ht(v,x){return Dt(v.type,x,void 0,void 0,void 0,v.props)}function Et(v){return typeof v=="object"&&v!==null&&v.$$typeof===f}function It(v){var x={"=":"=0",":":"=2"};return"$"+v.replace(/[=:]/g,function(G){return x[G]})}var ol=/\/+/g;function Qt(v,x){return typeof v=="object"&&v!==null&&v.key!=null?It(""+v.key):x.toString(36)}function pe(){}function Ee(v){switch(v.status){case"fulfilled":return v.value;case"rejected":throw v.reason;default:switch(typeof v.status=="string"?v.then(pe,pe):(v.status="pending",v.then(function(x){v.status==="pending"&&(v.status="fulfilled",v.value=x)},function(x){v.status==="pending"&&(v.status="rejected",v.reason=x)})),v.status){case"fulfilled":return v.value;case"rejected":throw v.reason}}throw v}function jt(v,x,G,B,V){var it=typeof v;(it==="undefined"||it==="boolean")&&(v=null);var F=!1;if(v===null)F=!0;else switch(it){case"bigint":case"string":case"number":F=!0;break;case"object":switch(v.$$typeof){case f:case o:F=!0;break;case M:return F=v._init,jt(F(v._payload),x,G,B,V)}}if(F)return V=V(v),F=B===""?"."+Qt(v,0):B,bt(V)?(G="",F!=null&&(G=F.replace(ol,"$&/")+"/"),jt(V,x,G,"",function(kl){return kl})):V!=null&&(Et(V)&&(V=Ht(V,G+(V.key==null||v&&v.key===V.key?"":(""+V.key).replace(ol,"$&/")+"/")+F)),x.push(V)),1;F=0;var tl=B===""?".":B+":";if(bt(v))for(var gt=0;gt>>1,v=O[mt];if(0>>1;mth(B,J))Vh(it,B)?(O[mt]=it,O[V]=J,mt=V):(O[mt]=B,O[G]=J,mt=G);else if(Vh(it,J))O[mt]=it,O[V]=J,mt=V;else break t}}return q}function h(O,q){var J=O.sortIndex-q.sortIndex;return J!==0?J:O.id-q.id}if(f.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var S=performance;f.unstable_now=function(){return S.now()}}else{var R=Date,N=R.now();f.unstable_now=function(){return R.now()-N}}var p=[],m=[],M=1,H=null,C=3,k=!1,Q=!1,j=!1,Z=!1,Y=typeof setTimeout=="function"?setTimeout:null,nt=typeof clearTimeout=="function"?clearTimeout:null,P=typeof setImmediate<"u"?setImmediate:null;function bt(O){for(var q=d(m);q!==null;){if(q.callback===null)r(m);else if(q.startTime<=O)r(m),q.sortIndex=q.expirationTime,o(p,q);else break;q=d(m)}}function W(O){if(j=!1,bt(O),!Q)if(d(p)!==null)Q=!0,xt||(xt=!0,Qt());else{var q=d(m);q!==null&&jt(W,q.startTime-O)}}var xt=!1,Dt=-1,Ht=5,Et=-1;function It(){return Z?!0:!(f.unstable_now()-EtO&&It());){var mt=H.callback;if(typeof mt=="function"){H.callback=null,C=H.priorityLevel;var v=mt(H.expirationTime<=O);if(O=f.unstable_now(),typeof v=="function"){H.callback=v,bt(O),q=!0;break l}H===d(p)&&r(p),bt(O)}else r(p);H=d(p)}if(H!==null)q=!0;else{var x=d(m);x!==null&&jt(W,x.startTime-O),q=!1}}break t}finally{H=null,C=J,k=!1}q=void 0}}finally{q?Qt():xt=!1}}}var Qt;if(typeof P=="function")Qt=function(){P(ol)};else if(typeof MessageChannel<"u"){var pe=new MessageChannel,Ee=pe.port2;pe.port1.onmessage=ol,Qt=function(){Ee.postMessage(null)}}else Qt=function(){Y(ol,0)};function jt(O,q){Dt=Y(function(){O(f.unstable_now())},q)}f.unstable_IdlePriority=5,f.unstable_ImmediatePriority=1,f.unstable_LowPriority=4,f.unstable_NormalPriority=3,f.unstable_Profiling=null,f.unstable_UserBlockingPriority=2,f.unstable_cancelCallback=function(O){O.callback=null},f.unstable_forceFrameRate=function(O){0>O||125mt?(O.sortIndex=J,o(m,O),d(p)===null&&O===d(m)&&(j?(nt(Dt),Dt=-1):j=!0,jt(W,J-mt))):(O.sortIndex=v,o(p,O),Q||k||(Q=!0,xt||(xt=!0,Qt()))),O},f.unstable_shouldYield=It,f.unstable_wrapCallback=function(O){var q=C;return function(){var J=C;C=q;try{return O.apply(this,arguments)}finally{C=J}}}}(Ec)),Ec}var Ud;function _v(){return Ud||(Ud=1,pc.exports=Dv()),pc.exports}var Tc={exports:{}},Kt={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Nd;function Uv(){if(Nd)return Kt;Nd=1;var f=Oc();function o(p){var m="https://react.dev/errors/"+p;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(o){console.error(o)}}return f(),Tc.exports=Uv(),Tc.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hd;function xv(){if(Hd)return Ou;Hd=1;var f=_v(),o=Oc(),d=Nv();function r(t){var l="https://react.dev/errors/"+t;if(1v||(t.current=mt[v],mt[v]=null,v--)}function B(t,l){v++,mt[v]=t.current,t.current=l}var V=x(null),it=x(null),F=x(null),tl=x(null);function gt(t,l){switch(B(F,l),B(it,t),B(V,null),l.nodeType){case 9:case 11:t=(t=l.documentElement)&&(t=t.namespaceURI)?Is(t):0;break;default:if(t=l.tagName,l=l.namespaceURI)l=Is(l),t=td(l,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}G(V),B(V,t)}function kl(){G(V),G(it),G(F)}function li(t){t.memoizedState!==null&&B(tl,t);var l=V.current,e=td(l,t.type);l!==e&&(B(it,t),B(V,e))}function xu(t){it.current===t&&(G(V),G(it)),tl.current===t&&(G(tl),pu._currentValue=J)}var ei=Object.prototype.hasOwnProperty,ai=f.unstable_scheduleCallback,ui=f.unstable_cancelCallback,eh=f.unstable_shouldYield,ah=f.unstable_requestPaint,Al=f.unstable_now,uh=f.unstable_getCurrentPriorityLevel,xc=f.unstable_ImmediatePriority,Hc=f.unstable_UserBlockingPriority,Hu=f.unstable_NormalPriority,nh=f.unstable_LowPriority,Cc=f.unstable_IdlePriority,ih=f.log,fh=f.unstable_setDisableYieldValue,Da=null,ll=null;function Wl(t){if(typeof ih=="function"&&fh(t),ll&&typeof ll.setStrictMode=="function")try{ll.setStrictMode(Da,t)}catch{}}var el=Math.clz32?Math.clz32:oh,ch=Math.log,rh=Math.LN2;function oh(t){return t>>>=0,t===0?32:31-(ch(t)/rh|0)|0}var Cu=256,Bu=4194304;function Te(t){var l=t&42;if(l!==0)return l;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function qu(t,l,e){var a=t.pendingLanes;if(a===0)return 0;var u=0,n=t.suspendedLanes,i=t.pingedLanes;t=t.warmLanes;var c=a&134217727;return c!==0?(a=c&~n,a!==0?u=Te(a):(i&=c,i!==0?u=Te(i):e||(e=c&~t,e!==0&&(u=Te(e))))):(c=a&~n,c!==0?u=Te(c):i!==0?u=Te(i):e||(e=a&~t,e!==0&&(u=Te(e)))),u===0?0:l!==0&&l!==u&&(l&n)===0&&(n=u&-u,e=l&-l,n>=e||n===32&&(e&4194048)!==0)?l:u}function _a(t,l){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&l)===0}function sh(t,l){switch(t){case 1:case 2:case 4:case 8:case 64:return l+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Bc(){var t=Cu;return Cu<<=1,(Cu&4194048)===0&&(Cu=256),t}function qc(){var t=Bu;return Bu<<=1,(Bu&62914560)===0&&(Bu=4194304),t}function ni(t){for(var l=[],e=0;31>e;e++)l.push(t);return l}function Ua(t,l){t.pendingLanes|=l,l!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function dh(t,l,e,a,u,n){var i=t.pendingLanes;t.pendingLanes=e,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=e,t.entangledLanes&=e,t.errorRecoveryDisabledLanes&=e,t.shellSuspendCounter=0;var c=t.entanglements,s=t.expirationTimes,E=t.hiddenUpdates;for(e=i&~e;0)":-1u||s[a]!==E[u]){var z=` +`+s[a].replace(" at new "," at ");return t.displayName&&z.includes("")&&(z=z.replace("",t.displayName)),z}while(1<=a&&0<=u);break}}}finally{si=!1,Error.prepareStackTrace=e}return(e=t?t.displayName||t.name:"")?we(e):""}function Sh(t){switch(t.tag){case 26:case 27:case 5:return we(t.type);case 16:return we("Lazy");case 13:return we("Suspense");case 19:return we("SuspenseList");case 0:case 15:return di(t.type,!1);case 11:return di(t.type.render,!1);case 1:return di(t.type,!0);case 31:return we("Activity");default:return""}}function wc(t){try{var l="";do l+=Sh(t),t=t.return;while(t);return l}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}function sl(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"undefined":return t;case"object":return t;default:return""}}function Jc(t){var l=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function bh(t){var l=Jc(t)?"checked":"value",e=Object.getOwnPropertyDescriptor(t.constructor.prototype,l),a=""+t[l];if(!t.hasOwnProperty(l)&&typeof e<"u"&&typeof e.get=="function"&&typeof e.set=="function"){var u=e.get,n=e.set;return Object.defineProperty(t,l,{configurable:!0,get:function(){return u.call(this)},set:function(i){a=""+i,n.call(this,i)}}),Object.defineProperty(t,l,{enumerable:e.enumerable}),{getValue:function(){return a},setValue:function(i){a=""+i},stopTracking:function(){t._valueTracker=null,delete t[l]}}}}function Lu(t){t._valueTracker||(t._valueTracker=bh(t))}function $c(t){if(!t)return!1;var l=t._valueTracker;if(!l)return!0;var e=l.getValue(),a="";return t&&(a=Jc(t)?t.checked?"true":"false":t.value),t=a,t!==e?(l.setValue(t),!0):!1}function Xu(t){if(t=t||(typeof document<"u"?document:void 0),typeof t>"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var ph=/[\n"\\]/g;function dl(t){return t.replace(ph,function(l){return"\\"+l.charCodeAt(0).toString(16)+" "})}function hi(t,l,e,a,u,n,i,c){t.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?t.type=i:t.removeAttribute("type"),l!=null?i==="number"?(l===0&&t.value===""||t.value!=l)&&(t.value=""+sl(l)):t.value!==""+sl(l)&&(t.value=""+sl(l)):i!=="submit"&&i!=="reset"||t.removeAttribute("value"),l!=null?mi(t,i,sl(l)):e!=null?mi(t,i,sl(e)):a!=null&&t.removeAttribute("value"),u==null&&n!=null&&(t.defaultChecked=!!n),u!=null&&(t.checked=u&&typeof u!="function"&&typeof u!="symbol"),c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?t.name=""+sl(c):t.removeAttribute("name")}function kc(t,l,e,a,u,n,i,c){if(n!=null&&typeof n!="function"&&typeof n!="symbol"&&typeof n!="boolean"&&(t.type=n),l!=null||e!=null){if(!(n!=="submit"&&n!=="reset"||l!=null))return;e=e!=null?""+sl(e):"",l=l!=null?""+sl(l):e,c||l===t.value||(t.value=l),t.defaultValue=l}a=a??u,a=typeof a!="function"&&typeof a!="symbol"&&!!a,t.checked=c?t.checked:!!a,t.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(t.name=i)}function mi(t,l,e){l==="number"&&Xu(t.ownerDocument)===t||t.defaultValue===""+e||(t.defaultValue=""+e)}function Je(t,l,e,a){if(t=t.options,l){l={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),bi=!1;if(xl)try{var Ca={};Object.defineProperty(Ca,"passive",{get:function(){bi=!0}}),window.addEventListener("test",Ca,Ca),window.removeEventListener("test",Ca,Ca)}catch{bi=!1}var Pl=null,pi=null,ju=null;function er(){if(ju)return ju;var t,l=pi,e=l.length,a,u="value"in Pl?Pl.value:Pl.textContent,n=u.length;for(t=0;t=Ya),cr=" ",rr=!1;function or(t,l){switch(t){case"keyup":return $h.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function sr(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Fe=!1;function Wh(t,l){switch(t){case"compositionend":return sr(l);case"keypress":return l.which!==32?null:(rr=!0,cr);case"textInput":return t=l.data,t===cr&&rr?null:t;default:return null}}function Fh(t,l){if(Fe)return t==="compositionend"||!zi&&or(t,l)?(t=er(),ju=pi=Pl=null,Fe=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:e,offset:l-t};t=a}t:{for(;e;){if(e.nextSibling){e=e.nextSibling;break t}e=e.parentNode}e=void 0}e=br(e)}}function Er(t,l){return t&&l?t===l?!0:t&&t.nodeType===3?!1:l&&l.nodeType===3?Er(t,l.parentNode):"contains"in t?t.contains(l):t.compareDocumentPosition?!!(t.compareDocumentPosition(l)&16):!1:!1}function Tr(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var l=Xu(t.document);l instanceof t.HTMLIFrameElement;){try{var e=typeof l.contentWindow.location.href=="string"}catch{e=!1}if(e)t=l.contentWindow;else break;l=Xu(t.document)}return l}function Di(t){var l=t&&t.nodeName&&t.nodeName.toLowerCase();return l&&(l==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||l==="textarea"||t.contentEditable==="true")}var nm=xl&&"documentMode"in document&&11>=document.documentMode,Pe=null,_i=null,Qa=null,Ui=!1;function Ar(t,l,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;Ui||Pe==null||Pe!==Xu(a)||(a=Pe,"selectionStart"in a&&Di(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Qa&&Xa(Qa,a)||(Qa=a,a=Hn(_i,"onSelect"),0>=i,u-=i,Cl=1<<32-el(l)+u|e<n?n:8;var i=O.T,c={};O.T=c,yf(t,!1,l,e);try{var s=u(),E=O.S;if(E!==null&&E(c,s),s!==null&&typeof s=="object"&&typeof s.then=="function"){var z=mm(s,a);eu(t,l,z,cl(t))}else eu(t,l,a,cl(t))}catch(_){eu(t,l,{then:function(){},status:"rejected",reason:_},cl())}finally{q.p=n,O.T=i}}function bm(){}function mf(t,l,e,a){if(t.tag!==5)throw Error(r(476));var u=zo(t).queue;Ro(t,u,l,J,e===null?bm:function(){return Oo(t),e(a)})}function zo(t){var l=t.memoizedState;if(l!==null)return l;l={memoizedState:J,baseState:J,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Gl,lastRenderedState:J},next:null};var e={};return l.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Gl,lastRenderedState:e},next:null},t.memoizedState=l,t=t.alternate,t!==null&&(t.memoizedState=l),l}function Oo(t){var l=zo(t).next.queue;eu(t,l,{},cl())}function vf(){return Vt(pu)}function Mo(){return Mt().memoizedState}function Do(){return Mt().memoizedState}function pm(t){for(var l=t.return;l!==null;){switch(l.tag){case 24:case 3:var e=cl();t=le(e);var a=ee(l,t,e);a!==null&&(rl(a,l,e),Wa(a,l,e)),l={cache:Vi()},t.payload=l;return}l=l.return}}function Em(t,l,e){var a=cl();e={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null},hn(t)?Uo(l,e):(e=Ci(t,l,e,a),e!==null&&(rl(e,t,a),No(e,l,a)))}function _o(t,l,e){var a=cl();eu(t,l,e,a)}function eu(t,l,e,a){var u={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null};if(hn(t))Uo(l,u);else{var n=t.alternate;if(t.lanes===0&&(n===null||n.lanes===0)&&(n=l.lastRenderedReducer,n!==null))try{var i=l.lastRenderedState,c=n(i,e);if(u.hasEagerState=!0,u.eagerState=c,al(c,i))return ku(t,l,u,0),yt===null&&$u(),!1}catch{}finally{}if(e=Ci(t,l,u,a),e!==null)return rl(e,t,a),No(e,l,a),!0}return!1}function yf(t,l,e,a){if(a={lane:2,revertLane:$f(),action:a,hasEagerState:!1,eagerState:null,next:null},hn(t)){if(l)throw Error(r(479))}else l=Ci(t,e,a,2),l!==null&&rl(l,t,2)}function hn(t){var l=t.alternate;return t===tt||l!==null&&l===tt}function Uo(t,l){ca=fn=!0;var e=t.pending;e===null?l.next=l:(l.next=e.next,e.next=l),t.pending=l}function No(t,l,e){if((e&4194048)!==0){var a=l.lanes;a&=t.pendingLanes,e|=a,l.lanes=e,Gc(t,e)}}var mn={readContext:Vt,use:rn,useCallback:Rt,useContext:Rt,useEffect:Rt,useImperativeHandle:Rt,useLayoutEffect:Rt,useInsertionEffect:Rt,useMemo:Rt,useReducer:Rt,useRef:Rt,useState:Rt,useDebugValue:Rt,useDeferredValue:Rt,useTransition:Rt,useSyncExternalStore:Rt,useId:Rt,useHostTransitionStatus:Rt,useFormState:Rt,useActionState:Rt,useOptimistic:Rt,useMemoCache:Rt,useCacheRefresh:Rt},xo={readContext:Vt,use:rn,useCallback:function(t,l){return Wt().memoizedState=[t,l===void 0?null:l],t},useContext:Vt,useEffect:vo,useImperativeHandle:function(t,l,e){e=e!=null?e.concat([t]):null,dn(4194308,4,bo.bind(null,l,t),e)},useLayoutEffect:function(t,l){return dn(4194308,4,t,l)},useInsertionEffect:function(t,l){dn(4,2,t,l)},useMemo:function(t,l){var e=Wt();l=l===void 0?null:l;var a=t();if(Be){Wl(!0);try{t()}finally{Wl(!1)}}return e.memoizedState=[a,l],a},useReducer:function(t,l,e){var a=Wt();if(e!==void 0){var u=e(l);if(Be){Wl(!0);try{e(l)}finally{Wl(!1)}}}else u=l;return a.memoizedState=a.baseState=u,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:u},a.queue=t,t=t.dispatch=Em.bind(null,tt,t),[a.memoizedState,t]},useRef:function(t){var l=Wt();return t={current:t},l.memoizedState=t},useState:function(t){t=of(t);var l=t.queue,e=_o.bind(null,tt,l);return l.dispatch=e,[t.memoizedState,e]},useDebugValue:df,useDeferredValue:function(t,l){var e=Wt();return hf(e,t,l)},useTransition:function(){var t=of(!1);return t=Ro.bind(null,tt,t.queue,!0,!1),Wt().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,l,e){var a=tt,u=Wt();if(ct){if(e===void 0)throw Error(r(407));e=e()}else{if(e=l(),yt===null)throw Error(r(349));(ut&124)!==0||Pr(a,l,e)}u.memoizedState=e;var n={value:e,getSnapshot:l};return u.queue=n,vo(to.bind(null,a,n,t),[t]),a.flags|=2048,oa(9,sn(),Ir.bind(null,a,n,e,l),null),e},useId:function(){var t=Wt(),l=yt.identifierPrefix;if(ct){var e=Bl,a=Cl;e=(a&~(1<<32-el(a)-1)).toString(32)+e,l="«"+l+"R"+e,e=cn++,0w?(Yt=X,X=null):Yt=X.sibling;var ft=T(g,X,b[w],D);if(ft===null){X===null&&(X=Yt);break}t&&X&&ft.alternate===null&&l(g,X),y=n(ft,y,w),lt===null?L=ft:lt.sibling=ft,lt=ft,X=Yt}if(w===b.length)return e(g,X),ct&&_e(g,w),L;if(X===null){for(;ww?(Yt=X,X=null):Yt=X.sibling;var be=T(g,X,ft.value,D);if(be===null){X===null&&(X=Yt);break}t&&X&&be.alternate===null&&l(g,X),y=n(be,y,w),lt===null?L=be:lt.sibling=be,lt=be,X=Yt}if(ft.done)return e(g,X),ct&&_e(g,w),L;if(X===null){for(;!ft.done;w++,ft=b.next())ft=_(g,ft.value,D),ft!==null&&(y=n(ft,y,w),lt===null?L=ft:lt.sibling=ft,lt=ft);return ct&&_e(g,w),L}for(X=a(X);!ft.done;w++,ft=b.next())ft=A(X,g,w,ft.value,D),ft!==null&&(t&&ft.alternate!==null&&X.delete(ft.key===null?w:ft.key),y=n(ft,y,w),lt===null?L=ft:lt.sibling=ft,lt=ft);return t&&X.forEach(function(Av){return l(g,Av)}),ct&&_e(g,w),L}function ht(g,y,b,D){if(typeof b=="object"&&b!==null&&b.type===Q&&b.key===null&&(b=b.props.children),typeof b=="object"&&b!==null){switch(b.$$typeof){case C:t:{for(var L=b.key;y!==null;){if(y.key===L){if(L=b.type,L===Q){if(y.tag===7){e(g,y.sibling),D=u(y,b.props.children),D.return=g,g=D;break t}}else if(y.elementType===L||typeof L=="object"&&L!==null&&L.$$typeof===Ht&&Co(L)===y.type){e(g,y.sibling),D=u(y,b.props),uu(D,b),D.return=g,g=D;break t}e(g,y);break}else l(g,y);y=y.sibling}b.type===Q?(D=Me(b.props.children,g.mode,D,b.key),D.return=g,g=D):(D=Fu(b.type,b.key,b.props,null,g.mode,D),uu(D,b),D.return=g,g=D)}return i(g);case k:t:{for(L=b.key;y!==null;){if(y.key===L)if(y.tag===4&&y.stateNode.containerInfo===b.containerInfo&&y.stateNode.implementation===b.implementation){e(g,y.sibling),D=u(y,b.children||[]),D.return=g,g=D;break t}else{e(g,y);break}else l(g,y);y=y.sibling}D=Yi(b,g.mode,D),D.return=g,g=D}return i(g);case Ht:return L=b._init,b=L(b._payload),ht(g,y,b,D)}if(jt(b))return $(g,y,b,D);if(Qt(b)){if(L=Qt(b),typeof L!="function")throw Error(r(150));return b=L.call(b),K(g,y,b,D)}if(typeof b.then=="function")return ht(g,y,vn(b),D);if(b.$$typeof===P)return ht(g,y,ln(g,b),D);yn(g,b)}return typeof b=="string"&&b!==""||typeof b=="number"||typeof b=="bigint"?(b=""+b,y!==null&&y.tag===6?(e(g,y.sibling),D=u(y,b),D.return=g,g=D):(e(g,y),D=qi(b,g.mode,D),D.return=g,g=D),i(g)):e(g,y)}return function(g,y,b,D){try{au=0;var L=ht(g,y,b,D);return sa=null,L}catch(X){if(X===$a||X===an)throw X;var lt=ul(29,X,null,g.mode);return lt.lanes=D,lt.return=g,lt}finally{}}}var da=Bo(!0),qo=Bo(!1),gl=x(null),zl=null;function ue(t){var l=t.alternate;B(Ut,Ut.current&1),B(gl,t),zl===null&&(l===null||fa.current!==null||l.memoizedState!==null)&&(zl=t)}function Yo(t){if(t.tag===22){if(B(Ut,Ut.current),B(gl,t),zl===null){var l=t.alternate;l!==null&&l.memoizedState!==null&&(zl=t)}}else ne()}function ne(){B(Ut,Ut.current),B(gl,gl.current)}function Ll(t){G(gl),zl===t&&(zl=null),G(Ut)}var Ut=x(0);function gn(t){for(var l=t;l!==null;){if(l.tag===13){var e=l.memoizedState;if(e!==null&&(e=e.dehydrated,e===null||e.data==="$?"||ic(e)))return l}else if(l.tag===19&&l.memoizedProps.revealOrder!==void 0){if((l.flags&128)!==0)return l}else if(l.child!==null){l.child.return=l,l=l.child;continue}if(l===t)break;for(;l.sibling===null;){if(l.return===null||l.return===t)return null;l=l.return}l.sibling.return=l.return,l=l.sibling}return null}function gf(t,l,e,a){l=t.memoizedState,e=e(a,l),e=e==null?l:M({},l,e),t.memoizedState=e,t.lanes===0&&(t.updateQueue.baseState=e)}var Sf={enqueueSetState:function(t,l,e){t=t._reactInternals;var a=cl(),u=le(a);u.payload=l,e!=null&&(u.callback=e),l=ee(t,u,a),l!==null&&(rl(l,t,a),Wa(l,t,a))},enqueueReplaceState:function(t,l,e){t=t._reactInternals;var a=cl(),u=le(a);u.tag=1,u.payload=l,e!=null&&(u.callback=e),l=ee(t,u,a),l!==null&&(rl(l,t,a),Wa(l,t,a))},enqueueForceUpdate:function(t,l){t=t._reactInternals;var e=cl(),a=le(e);a.tag=2,l!=null&&(a.callback=l),l=ee(t,a,e),l!==null&&(rl(l,t,e),Wa(l,t,e))}};function Go(t,l,e,a,u,n,i){return t=t.stateNode,typeof t.shouldComponentUpdate=="function"?t.shouldComponentUpdate(a,n,i):l.prototype&&l.prototype.isPureReactComponent?!Xa(e,a)||!Xa(u,n):!0}function Lo(t,l,e,a){t=l.state,typeof l.componentWillReceiveProps=="function"&&l.componentWillReceiveProps(e,a),typeof l.UNSAFE_componentWillReceiveProps=="function"&&l.UNSAFE_componentWillReceiveProps(e,a),l.state!==t&&Sf.enqueueReplaceState(l,l.state,null)}function qe(t,l){var e=l;if("ref"in l){e={};for(var a in l)a!=="ref"&&(e[a]=l[a])}if(t=t.defaultProps){e===l&&(e=M({},e));for(var u in t)e[u]===void 0&&(e[u]=t[u])}return e}var Sn=typeof reportError=="function"?reportError:function(t){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var l=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof t=="object"&&t!==null&&typeof t.message=="string"?String(t.message):String(t),error:t});if(!window.dispatchEvent(l))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",t);return}console.error(t)};function Xo(t){Sn(t)}function Qo(t){console.error(t)}function jo(t){Sn(t)}function bn(t,l){try{var e=t.onUncaughtError;e(l.value,{componentStack:l.stack})}catch(a){setTimeout(function(){throw a})}}function Zo(t,l,e){try{var a=t.onCaughtError;a(e.value,{componentStack:e.stack,errorBoundary:l.tag===1?l.stateNode:null})}catch(u){setTimeout(function(){throw u})}}function bf(t,l,e){return e=le(e),e.tag=3,e.payload={element:null},e.callback=function(){bn(t,l)},e}function Vo(t){return t=le(t),t.tag=3,t}function Ko(t,l,e,a){var u=e.type.getDerivedStateFromError;if(typeof u=="function"){var n=a.value;t.payload=function(){return u(n)},t.callback=function(){Zo(l,e,a)}}var i=e.stateNode;i!==null&&typeof i.componentDidCatch=="function"&&(t.callback=function(){Zo(l,e,a),typeof u!="function"&&(se===null?se=new Set([this]):se.add(this));var c=a.stack;this.componentDidCatch(a.value,{componentStack:c!==null?c:""})})}function Am(t,l,e,a,u){if(e.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(l=e.alternate,l!==null&&Ka(l,e,u,!0),e=gl.current,e!==null){switch(e.tag){case 13:return zl===null?Zf():e.alternate===null&&At===0&&(At=3),e.flags&=-257,e.flags|=65536,e.lanes=u,a===Ji?e.flags|=16384:(l=e.updateQueue,l===null?e.updateQueue=new Set([a]):l.add(a),Kf(t,a,u)),!1;case 22:return e.flags|=65536,a===Ji?e.flags|=16384:(l=e.updateQueue,l===null?(l={transitions:null,markerInstances:null,retryQueue:new Set([a])},e.updateQueue=l):(e=l.retryQueue,e===null?l.retryQueue=new Set([a]):e.add(a)),Kf(t,a,u)),!1}throw Error(r(435,e.tag))}return Kf(t,a,u),Zf(),!1}if(ct)return l=gl.current,l!==null?((l.flags&65536)===0&&(l.flags|=256),l.flags|=65536,l.lanes=u,a!==Xi&&(t=Error(r(422),{cause:a}),Va(hl(t,e)))):(a!==Xi&&(l=Error(r(423),{cause:a}),Va(hl(l,e))),t=t.current.alternate,t.flags|=65536,u&=-u,t.lanes|=u,a=hl(a,e),u=bf(t.stateNode,a,u),Wi(t,u),At!==4&&(At=2)),!1;var n=Error(r(520),{cause:a});if(n=hl(n,e),su===null?su=[n]:su.push(n),At!==4&&(At=2),l===null)return!0;a=hl(a,e),e=l;do{switch(e.tag){case 3:return e.flags|=65536,t=u&-u,e.lanes|=t,t=bf(e.stateNode,a,t),Wi(e,t),!1;case 1:if(l=e.type,n=e.stateNode,(e.flags&128)===0&&(typeof l.getDerivedStateFromError=="function"||n!==null&&typeof n.componentDidCatch=="function"&&(se===null||!se.has(n))))return e.flags|=65536,u&=-u,e.lanes|=u,u=Vo(u),Ko(u,t,e,a),Wi(e,u),!1}e=e.return}while(e!==null);return!1}var wo=Error(r(461)),Bt=!1;function Gt(t,l,e,a){l.child=t===null?qo(l,null,e,a):da(l,t.child,e,a)}function Jo(t,l,e,a,u){e=e.render;var n=l.ref;if("ref"in a){var i={};for(var c in a)c!=="ref"&&(i[c]=a[c])}else i=a;return He(l),a=lf(t,l,e,i,n,u),c=ef(),t!==null&&!Bt?(af(t,l,u),Xl(t,l,u)):(ct&&c&&Gi(l),l.flags|=1,Gt(t,l,a,u),l.child)}function $o(t,l,e,a,u){if(t===null){var n=e.type;return typeof n=="function"&&!Bi(n)&&n.defaultProps===void 0&&e.compare===null?(l.tag=15,l.type=n,ko(t,l,n,a,u)):(t=Fu(e.type,null,a,l,l.mode,u),t.ref=l.ref,t.return=l,l.child=t)}if(n=t.child,!Mf(t,u)){var i=n.memoizedProps;if(e=e.compare,e=e!==null?e:Xa,e(i,a)&&t.ref===l.ref)return Xl(t,l,u)}return l.flags|=1,t=Hl(n,a),t.ref=l.ref,t.return=l,l.child=t}function ko(t,l,e,a,u){if(t!==null){var n=t.memoizedProps;if(Xa(n,a)&&t.ref===l.ref)if(Bt=!1,l.pendingProps=a=n,Mf(t,u))(t.flags&131072)!==0&&(Bt=!0);else return l.lanes=t.lanes,Xl(t,l,u)}return pf(t,l,e,a,u)}function Wo(t,l,e){var a=l.pendingProps,u=a.children,n=t!==null?t.memoizedState:null;if(a.mode==="hidden"){if((l.flags&128)!==0){if(a=n!==null?n.baseLanes|e:e,t!==null){for(u=l.child=t.child,n=0;u!==null;)n=n|u.lanes|u.childLanes,u=u.sibling;l.childLanes=n&~a}else l.childLanes=0,l.child=null;return Fo(t,l,a,e)}if((e&536870912)!==0)l.memoizedState={baseLanes:0,cachePool:null},t!==null&&en(l,n!==null?n.cachePool:null),n!==null?$r(l,n):Pi(),Yo(l);else return l.lanes=l.childLanes=536870912,Fo(t,l,n!==null?n.baseLanes|e:e,e)}else n!==null?(en(l,n.cachePool),$r(l,n),ne(),l.memoizedState=null):(t!==null&&en(l,null),Pi(),ne());return Gt(t,l,u,e),l.child}function Fo(t,l,e,a){var u=wi();return u=u===null?null:{parent:_t._currentValue,pool:u},l.memoizedState={baseLanes:e,cachePool:u},t!==null&&en(l,null),Pi(),Yo(l),t!==null&&Ka(t,l,a,!0),null}function pn(t,l){var e=l.ref;if(e===null)t!==null&&t.ref!==null&&(l.flags|=4194816);else{if(typeof e!="function"&&typeof e!="object")throw Error(r(284));(t===null||t.ref!==e)&&(l.flags|=4194816)}}function pf(t,l,e,a,u){return He(l),e=lf(t,l,e,a,void 0,u),a=ef(),t!==null&&!Bt?(af(t,l,u),Xl(t,l,u)):(ct&&a&&Gi(l),l.flags|=1,Gt(t,l,e,u),l.child)}function Po(t,l,e,a,u,n){return He(l),l.updateQueue=null,e=Wr(l,a,e,u),kr(t),a=ef(),t!==null&&!Bt?(af(t,l,n),Xl(t,l,n)):(ct&&a&&Gi(l),l.flags|=1,Gt(t,l,e,n),l.child)}function Io(t,l,e,a,u){if(He(l),l.stateNode===null){var n=ea,i=e.contextType;typeof i=="object"&&i!==null&&(n=Vt(i)),n=new e(a,n),l.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,n.updater=Sf,l.stateNode=n,n._reactInternals=l,n=l.stateNode,n.props=a,n.state=l.memoizedState,n.refs={},$i(l),i=e.contextType,n.context=typeof i=="object"&&i!==null?Vt(i):ea,n.state=l.memoizedState,i=e.getDerivedStateFromProps,typeof i=="function"&&(gf(l,e,i,a),n.state=l.memoizedState),typeof e.getDerivedStateFromProps=="function"||typeof n.getSnapshotBeforeUpdate=="function"||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(i=n.state,typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount(),i!==n.state&&Sf.enqueueReplaceState(n,n.state,null),Pa(l,a,n,u),Fa(),n.state=l.memoizedState),typeof n.componentDidMount=="function"&&(l.flags|=4194308),a=!0}else if(t===null){n=l.stateNode;var c=l.memoizedProps,s=qe(e,c);n.props=s;var E=n.context,z=e.contextType;i=ea,typeof z=="object"&&z!==null&&(i=Vt(z));var _=e.getDerivedStateFromProps;z=typeof _=="function"||typeof n.getSnapshotBeforeUpdate=="function",c=l.pendingProps!==c,z||typeof n.UNSAFE_componentWillReceiveProps!="function"&&typeof n.componentWillReceiveProps!="function"||(c||E!==i)&&Lo(l,n,a,i),te=!1;var T=l.memoizedState;n.state=T,Pa(l,a,n,u),Fa(),E=l.memoizedState,c||T!==E||te?(typeof _=="function"&&(gf(l,e,_,a),E=l.memoizedState),(s=te||Go(l,e,s,a,T,E,i))?(z||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount()),typeof n.componentDidMount=="function"&&(l.flags|=4194308)):(typeof n.componentDidMount=="function"&&(l.flags|=4194308),l.memoizedProps=a,l.memoizedState=E),n.props=a,n.state=E,n.context=i,a=s):(typeof n.componentDidMount=="function"&&(l.flags|=4194308),a=!1)}else{n=l.stateNode,ki(t,l),i=l.memoizedProps,z=qe(e,i),n.props=z,_=l.pendingProps,T=n.context,E=e.contextType,s=ea,typeof E=="object"&&E!==null&&(s=Vt(E)),c=e.getDerivedStateFromProps,(E=typeof c=="function"||typeof n.getSnapshotBeforeUpdate=="function")||typeof n.UNSAFE_componentWillReceiveProps!="function"&&typeof n.componentWillReceiveProps!="function"||(i!==_||T!==s)&&Lo(l,n,a,s),te=!1,T=l.memoizedState,n.state=T,Pa(l,a,n,u),Fa();var A=l.memoizedState;i!==_||T!==A||te||t!==null&&t.dependencies!==null&&tn(t.dependencies)?(typeof c=="function"&&(gf(l,e,c,a),A=l.memoizedState),(z=te||Go(l,e,z,a,T,A,s)||t!==null&&t.dependencies!==null&&tn(t.dependencies))?(E||typeof n.UNSAFE_componentWillUpdate!="function"&&typeof n.componentWillUpdate!="function"||(typeof n.componentWillUpdate=="function"&&n.componentWillUpdate(a,A,s),typeof n.UNSAFE_componentWillUpdate=="function"&&n.UNSAFE_componentWillUpdate(a,A,s)),typeof n.componentDidUpdate=="function"&&(l.flags|=4),typeof n.getSnapshotBeforeUpdate=="function"&&(l.flags|=1024)):(typeof n.componentDidUpdate!="function"||i===t.memoizedProps&&T===t.memoizedState||(l.flags|=4),typeof n.getSnapshotBeforeUpdate!="function"||i===t.memoizedProps&&T===t.memoizedState||(l.flags|=1024),l.memoizedProps=a,l.memoizedState=A),n.props=a,n.state=A,n.context=s,a=z):(typeof n.componentDidUpdate!="function"||i===t.memoizedProps&&T===t.memoizedState||(l.flags|=4),typeof n.getSnapshotBeforeUpdate!="function"||i===t.memoizedProps&&T===t.memoizedState||(l.flags|=1024),a=!1)}return n=a,pn(t,l),a=(l.flags&128)!==0,n||a?(n=l.stateNode,e=a&&typeof e.getDerivedStateFromError!="function"?null:n.render(),l.flags|=1,t!==null&&a?(l.child=da(l,t.child,null,u),l.child=da(l,null,e,u)):Gt(t,l,e,u),l.memoizedState=n.state,t=l.child):t=Xl(t,l,u),t}function ts(t,l,e,a){return Za(),l.flags|=256,Gt(t,l,e,a),l.child}var Ef={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Tf(t){return{baseLanes:t,cachePool:Xr()}}function Af(t,l,e){return t=t!==null?t.childLanes&~e:0,l&&(t|=Sl),t}function ls(t,l,e){var a=l.pendingProps,u=!1,n=(l.flags&128)!==0,i;if((i=n)||(i=t!==null&&t.memoizedState===null?!1:(Ut.current&2)!==0),i&&(u=!0,l.flags&=-129),i=(l.flags&32)!==0,l.flags&=-33,t===null){if(ct){if(u?ue(l):ne(),ct){var c=Tt,s;if(s=c){t:{for(s=c,c=Rl;s.nodeType!==8;){if(!c){c=null;break t}if(s=Tl(s.nextSibling),s===null){c=null;break t}}c=s}c!==null?(l.memoizedState={dehydrated:c,treeContext:De!==null?{id:Cl,overflow:Bl}:null,retryLane:536870912,hydrationErrors:null},s=ul(18,null,null,0),s.stateNode=c,s.return=l,l.child=s,Jt=l,Tt=null,s=!0):s=!1}s||Ne(l)}if(c=l.memoizedState,c!==null&&(c=c.dehydrated,c!==null))return ic(c)?l.lanes=32:l.lanes=536870912,null;Ll(l)}return c=a.children,a=a.fallback,u?(ne(),u=l.mode,c=En({mode:"hidden",children:c},u),a=Me(a,u,e,null),c.return=l,a.return=l,c.sibling=a,l.child=c,u=l.child,u.memoizedState=Tf(e),u.childLanes=Af(t,i,e),l.memoizedState=Ef,a):(ue(l),Rf(l,c))}if(s=t.memoizedState,s!==null&&(c=s.dehydrated,c!==null)){if(n)l.flags&256?(ue(l),l.flags&=-257,l=zf(t,l,e)):l.memoizedState!==null?(ne(),l.child=t.child,l.flags|=128,l=null):(ne(),u=a.fallback,c=l.mode,a=En({mode:"visible",children:a.children},c),u=Me(u,c,e,null),u.flags|=2,a.return=l,u.return=l,a.sibling=u,l.child=a,da(l,t.child,null,e),a=l.child,a.memoizedState=Tf(e),a.childLanes=Af(t,i,e),l.memoizedState=Ef,l=u);else if(ue(l),ic(c)){if(i=c.nextSibling&&c.nextSibling.dataset,i)var E=i.dgst;i=E,a=Error(r(419)),a.stack="",a.digest=i,Va({value:a,source:null,stack:null}),l=zf(t,l,e)}else if(Bt||Ka(t,l,e,!1),i=(e&t.childLanes)!==0,Bt||i){if(i=yt,i!==null&&(a=e&-e,a=(a&42)!==0?1:ii(a),a=(a&(i.suspendedLanes|e))!==0?0:a,a!==0&&a!==s.retryLane))throw s.retryLane=a,la(t,a),rl(i,t,a),wo;c.data==="$?"||Zf(),l=zf(t,l,e)}else c.data==="$?"?(l.flags|=192,l.child=t.child,l=null):(t=s.treeContext,Tt=Tl(c.nextSibling),Jt=l,ct=!0,Ue=null,Rl=!1,t!==null&&(vl[yl++]=Cl,vl[yl++]=Bl,vl[yl++]=De,Cl=t.id,Bl=t.overflow,De=l),l=Rf(l,a.children),l.flags|=4096);return l}return u?(ne(),u=a.fallback,c=l.mode,s=t.child,E=s.sibling,a=Hl(s,{mode:"hidden",children:a.children}),a.subtreeFlags=s.subtreeFlags&65011712,E!==null?u=Hl(E,u):(u=Me(u,c,e,null),u.flags|=2),u.return=l,a.return=l,a.sibling=u,l.child=a,a=u,u=l.child,c=t.child.memoizedState,c===null?c=Tf(e):(s=c.cachePool,s!==null?(E=_t._currentValue,s=s.parent!==E?{parent:E,pool:E}:s):s=Xr(),c={baseLanes:c.baseLanes|e,cachePool:s}),u.memoizedState=c,u.childLanes=Af(t,i,e),l.memoizedState=Ef,a):(ue(l),e=t.child,t=e.sibling,e=Hl(e,{mode:"visible",children:a.children}),e.return=l,e.sibling=null,t!==null&&(i=l.deletions,i===null?(l.deletions=[t],l.flags|=16):i.push(t)),l.child=e,l.memoizedState=null,e)}function Rf(t,l){return l=En({mode:"visible",children:l},t.mode),l.return=t,t.child=l}function En(t,l){return t=ul(22,t,null,l),t.lanes=0,t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},t}function zf(t,l,e){return da(l,t.child,null,e),t=Rf(l,l.pendingProps.children),t.flags|=2,l.memoizedState=null,t}function es(t,l,e){t.lanes|=l;var a=t.alternate;a!==null&&(a.lanes|=l),ji(t.return,l,e)}function Of(t,l,e,a,u){var n=t.memoizedState;n===null?t.memoizedState={isBackwards:l,rendering:null,renderingStartTime:0,last:a,tail:e,tailMode:u}:(n.isBackwards=l,n.rendering=null,n.renderingStartTime=0,n.last=a,n.tail=e,n.tailMode=u)}function as(t,l,e){var a=l.pendingProps,u=a.revealOrder,n=a.tail;if(Gt(t,l,a.children,e),a=Ut.current,(a&2)!==0)a=a&1|2,l.flags|=128;else{if(t!==null&&(t.flags&128)!==0)t:for(t=l.child;t!==null;){if(t.tag===13)t.memoizedState!==null&&es(t,e,l);else if(t.tag===19)es(t,e,l);else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===l)break t;for(;t.sibling===null;){if(t.return===null||t.return===l)break t;t=t.return}t.sibling.return=t.return,t=t.sibling}a&=1}switch(B(Ut,a),u){case"forwards":for(e=l.child,u=null;e!==null;)t=e.alternate,t!==null&&gn(t)===null&&(u=e),e=e.sibling;e=u,e===null?(u=l.child,l.child=null):(u=e.sibling,e.sibling=null),Of(l,!1,u,e,n);break;case"backwards":for(e=null,u=l.child,l.child=null;u!==null;){if(t=u.alternate,t!==null&&gn(t)===null){l.child=u;break}t=u.sibling,u.sibling=e,e=u,u=t}Of(l,!0,e,null,n);break;case"together":Of(l,!1,null,null,void 0);break;default:l.memoizedState=null}return l.child}function Xl(t,l,e){if(t!==null&&(l.dependencies=t.dependencies),oe|=l.lanes,(e&l.childLanes)===0)if(t!==null){if(Ka(t,l,e,!1),(e&l.childLanes)===0)return null}else return null;if(t!==null&&l.child!==t.child)throw Error(r(153));if(l.child!==null){for(t=l.child,e=Hl(t,t.pendingProps),l.child=e,e.return=l;t.sibling!==null;)t=t.sibling,e=e.sibling=Hl(t,t.pendingProps),e.return=l;e.sibling=null}return l.child}function Mf(t,l){return(t.lanes&l)!==0?!0:(t=t.dependencies,!!(t!==null&&tn(t)))}function Rm(t,l,e){switch(l.tag){case 3:gt(l,l.stateNode.containerInfo),Il(l,_t,t.memoizedState.cache),Za();break;case 27:case 5:li(l);break;case 4:gt(l,l.stateNode.containerInfo);break;case 10:Il(l,l.type,l.memoizedProps.value);break;case 13:var a=l.memoizedState;if(a!==null)return a.dehydrated!==null?(ue(l),l.flags|=128,null):(e&l.child.childLanes)!==0?ls(t,l,e):(ue(l),t=Xl(t,l,e),t!==null?t.sibling:null);ue(l);break;case 19:var u=(t.flags&128)!==0;if(a=(e&l.childLanes)!==0,a||(Ka(t,l,e,!1),a=(e&l.childLanes)!==0),u){if(a)return as(t,l,e);l.flags|=128}if(u=l.memoizedState,u!==null&&(u.rendering=null,u.tail=null,u.lastEffect=null),B(Ut,Ut.current),a)break;return null;case 22:case 23:return l.lanes=0,Wo(t,l,e);case 24:Il(l,_t,t.memoizedState.cache)}return Xl(t,l,e)}function us(t,l,e){if(t!==null)if(t.memoizedProps!==l.pendingProps)Bt=!0;else{if(!Mf(t,e)&&(l.flags&128)===0)return Bt=!1,Rm(t,l,e);Bt=(t.flags&131072)!==0}else Bt=!1,ct&&(l.flags&1048576)!==0&&Hr(l,Iu,l.index);switch(l.lanes=0,l.tag){case 16:t:{t=l.pendingProps;var a=l.elementType,u=a._init;if(a=u(a._payload),l.type=a,typeof a=="function")Bi(a)?(t=qe(a,t),l.tag=1,l=Io(null,l,a,t,e)):(l.tag=0,l=pf(null,l,a,t,e));else{if(a!=null){if(u=a.$$typeof,u===bt){l.tag=11,l=Jo(null,l,a,t,e);break t}else if(u===Dt){l.tag=14,l=$o(null,l,a,t,e);break t}}throw l=Ee(a)||a,Error(r(306,l,""))}}return l;case 0:return pf(t,l,l.type,l.pendingProps,e);case 1:return a=l.type,u=qe(a,l.pendingProps),Io(t,l,a,u,e);case 3:t:{if(gt(l,l.stateNode.containerInfo),t===null)throw Error(r(387));a=l.pendingProps;var n=l.memoizedState;u=n.element,ki(t,l),Pa(l,a,null,e);var i=l.memoizedState;if(a=i.cache,Il(l,_t,a),a!==n.cache&&Zi(l,[_t],e,!0),Fa(),a=i.element,n.isDehydrated)if(n={element:a,isDehydrated:!1,cache:i.cache},l.updateQueue.baseState=n,l.memoizedState=n,l.flags&256){l=ts(t,l,a,e);break t}else if(a!==u){u=hl(Error(r(424)),l),Va(u),l=ts(t,l,a,e);break t}else{switch(t=l.stateNode.containerInfo,t.nodeType){case 9:t=t.body;break;default:t=t.nodeName==="HTML"?t.ownerDocument.body:t}for(Tt=Tl(t.firstChild),Jt=l,ct=!0,Ue=null,Rl=!0,e=qo(l,null,a,e),l.child=e;e;)e.flags=e.flags&-3|4096,e=e.sibling}else{if(Za(),a===u){l=Xl(t,l,e);break t}Gt(t,l,a,e)}l=l.child}return l;case 26:return pn(t,l),t===null?(e=cd(l.type,null,l.pendingProps,null))?l.memoizedState=e:ct||(e=l.type,t=l.pendingProps,a=Bn(F.current).createElement(e),a[Zt]=l,a[$t]=t,Xt(a,e,t),Ct(a),l.stateNode=a):l.memoizedState=cd(l.type,t.memoizedProps,l.pendingProps,t.memoizedState),null;case 27:return li(l),t===null&&ct&&(a=l.stateNode=nd(l.type,l.pendingProps,F.current),Jt=l,Rl=!0,u=Tt,me(l.type)?(fc=u,Tt=Tl(a.firstChild)):Tt=u),Gt(t,l,l.pendingProps.children,e),pn(t,l),t===null&&(l.flags|=4194304),l.child;case 5:return t===null&&ct&&((u=a=Tt)&&(a=Pm(a,l.type,l.pendingProps,Rl),a!==null?(l.stateNode=a,Jt=l,Tt=Tl(a.firstChild),Rl=!1,u=!0):u=!1),u||Ne(l)),li(l),u=l.type,n=l.pendingProps,i=t!==null?t.memoizedProps:null,a=n.children,ac(u,n)?a=null:i!==null&&ac(u,i)&&(l.flags|=32),l.memoizedState!==null&&(u=lf(t,l,ym,null,null,e),pu._currentValue=u),pn(t,l),Gt(t,l,a,e),l.child;case 6:return t===null&&ct&&((t=e=Tt)&&(e=Im(e,l.pendingProps,Rl),e!==null?(l.stateNode=e,Jt=l,Tt=null,t=!0):t=!1),t||Ne(l)),null;case 13:return ls(t,l,e);case 4:return gt(l,l.stateNode.containerInfo),a=l.pendingProps,t===null?l.child=da(l,null,a,e):Gt(t,l,a,e),l.child;case 11:return Jo(t,l,l.type,l.pendingProps,e);case 7:return Gt(t,l,l.pendingProps,e),l.child;case 8:return Gt(t,l,l.pendingProps.children,e),l.child;case 12:return Gt(t,l,l.pendingProps.children,e),l.child;case 10:return a=l.pendingProps,Il(l,l.type,a.value),Gt(t,l,a.children,e),l.child;case 9:return u=l.type._context,a=l.pendingProps.children,He(l),u=Vt(u),a=a(u),l.flags|=1,Gt(t,l,a,e),l.child;case 14:return $o(t,l,l.type,l.pendingProps,e);case 15:return ko(t,l,l.type,l.pendingProps,e);case 19:return as(t,l,e);case 31:return a=l.pendingProps,e=l.mode,a={mode:a.mode,children:a.children},t===null?(e=En(a,e),e.ref=l.ref,l.child=e,e.return=l,l=e):(e=Hl(t.child,a),e.ref=l.ref,l.child=e,e.return=l,l=e),l;case 22:return Wo(t,l,e);case 24:return He(l),a=Vt(_t),t===null?(u=wi(),u===null&&(u=yt,n=Vi(),u.pooledCache=n,n.refCount++,n!==null&&(u.pooledCacheLanes|=e),u=n),l.memoizedState={parent:a,cache:u},$i(l),Il(l,_t,u)):((t.lanes&e)!==0&&(ki(t,l),Pa(l,null,null,e),Fa()),u=t.memoizedState,n=l.memoizedState,u.parent!==a?(u={parent:a,cache:a},l.memoizedState=u,l.lanes===0&&(l.memoizedState=l.updateQueue.baseState=u),Il(l,_t,a)):(a=n.cache,Il(l,_t,a),a!==u.cache&&Zi(l,[_t],e,!0))),Gt(t,l,l.pendingProps.children,e),l.child;case 29:throw l.pendingProps}throw Error(r(156,l.tag))}function Ql(t){t.flags|=4}function ns(t,l){if(l.type!=="stylesheet"||(l.state.loading&4)!==0)t.flags&=-16777217;else if(t.flags|=16777216,!hd(l)){if(l=gl.current,l!==null&&((ut&4194048)===ut?zl!==null:(ut&62914560)!==ut&&(ut&536870912)===0||l!==zl))throw ka=Ji,Qr;t.flags|=8192}}function Tn(t,l){l!==null&&(t.flags|=4),t.flags&16384&&(l=t.tag!==22?qc():536870912,t.lanes|=l,ya|=l)}function nu(t,l){if(!ct)switch(t.tailMode){case"hidden":l=t.tail;for(var e=null;l!==null;)l.alternate!==null&&(e=l),l=l.sibling;e===null?t.tail=null:e.sibling=null;break;case"collapsed":e=t.tail;for(var a=null;e!==null;)e.alternate!==null&&(a=e),e=e.sibling;a===null?l||t.tail===null?t.tail=null:t.tail.sibling=null:a.sibling=null}}function pt(t){var l=t.alternate!==null&&t.alternate.child===t.child,e=0,a=0;if(l)for(var u=t.child;u!==null;)e|=u.lanes|u.childLanes,a|=u.subtreeFlags&65011712,a|=u.flags&65011712,u.return=t,u=u.sibling;else for(u=t.child;u!==null;)e|=u.lanes|u.childLanes,a|=u.subtreeFlags,a|=u.flags,u.return=t,u=u.sibling;return t.subtreeFlags|=a,t.childLanes=e,l}function zm(t,l,e){var a=l.pendingProps;switch(Li(l),l.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return pt(l),null;case 1:return pt(l),null;case 3:return e=l.stateNode,a=null,t!==null&&(a=t.memoizedState.cache),l.memoizedState.cache!==a&&(l.flags|=2048),Yl(_t),kl(),e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null),(t===null||t.child===null)&&(ja(l)?Ql(l):t===null||t.memoizedState.isDehydrated&&(l.flags&256)===0||(l.flags|=1024,qr())),pt(l),null;case 26:return e=l.memoizedState,t===null?(Ql(l),e!==null?(pt(l),ns(l,e)):(pt(l),l.flags&=-16777217)):e?e!==t.memoizedState?(Ql(l),pt(l),ns(l,e)):(pt(l),l.flags&=-16777217):(t.memoizedProps!==a&&Ql(l),pt(l),l.flags&=-16777217),null;case 27:xu(l),e=F.current;var u=l.type;if(t!==null&&l.stateNode!=null)t.memoizedProps!==a&&Ql(l);else{if(!a){if(l.stateNode===null)throw Error(r(166));return pt(l),null}t=V.current,ja(l)?Cr(l):(t=nd(u,a,e),l.stateNode=t,Ql(l))}return pt(l),null;case 5:if(xu(l),e=l.type,t!==null&&l.stateNode!=null)t.memoizedProps!==a&&Ql(l);else{if(!a){if(l.stateNode===null)throw Error(r(166));return pt(l),null}if(t=V.current,ja(l))Cr(l);else{switch(u=Bn(F.current),t){case 1:t=u.createElementNS("http://www.w3.org/2000/svg",e);break;case 2:t=u.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;default:switch(e){case"svg":t=u.createElementNS("http://www.w3.org/2000/svg",e);break;case"math":t=u.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;case"script":t=u.createElement("div"),t.innerHTML=" + + + +
+ + \ No newline at end of file From 0f8dc1f3747adc3954d438ab2b74b6a93ab806fa Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 00:53:45 -0700 Subject: [PATCH 05/54] add favicon --- vite-app/index.html | 4 ++-- vite-app/src/favicon.png | Bin 0 -> 4763 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 vite-app/src/favicon.png diff --git a/vite-app/index.html b/vite-app/index.html index 5226d694..f8fba7b1 100644 --- a/vite-app/index.html +++ b/vite-app/index.html @@ -2,10 +2,10 @@ - - Vite SPA Example + EP | Log Viewer +
diff --git a/vite-app/src/favicon.png b/vite-app/src/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..66ff03b44ec8e2b80f36ce8aeb4da603fb17aa23 GIT binary patch literal 4763 zcmd^DXIN8PvtEe;q6biV5zr6}3IZwtk*X#VM4EI&i6AXBL23j#}BhZzvq>vG=k zJOGt(2iP|`0N_{F$DB70f-Q{Nd)$}~ZCV}=&Lsb3o_2hX;y|(Dua_6n^RBw(sHI;1 zE9S;Q^X61@G>b~0B&8Ke_8uc6i&cs;i#du^h61|({P_S~bXzGZ0ZYh87vj!K^T-j9 z?Q=bEOLgx%# zYWvz}Vk0P@tH34mK1a^s*#?i3dA8a(uq}*SmWw8R!#YzpgQ$^{)6eBlQ4V+yMv<(e zjLbC@^{r6%!vW17{S(hK>@4cn$FGN`jq!2lZpT!j!7xQ;DsGPM@B`k=#!tTJu(3czbyVr?{uy?Qz|tfd?gK1_t)E!mr^pzCV?zT($~0wqzj z3S_Aiu=P?dJK?qSS+bB%n#g$MnoBD~rbSHbtg{N_934TI6xL&OE7$X$q-ReuE<;QS zofR!-#Q_!uXv=0Yw%^D6?QJcLgtj=~6vv*1#T}Li%e6B3(qu!Y7L9hu;HQQtSC`Lm z!A4v~OZSD7!_^Io6BVUOQKvmklz2exO*hk4nW_+$*;Iujae3PHelmtC7U@gS115W> z>6VWsqhyXA1pa+#CU)KZhHgJCR3>WxCHZ|((2`ErYfq%G>znwqccV5%CZ6&Ef7Me5 z+q60tH^;0MnjVyU5jd&APfK(`-^iC+iJd1|KR$C{sbc$5YT&G>8Q82JDkilsSkGa# zC2sqLE?}kkTC7;=uc%a%q^GIP%RAlyUD3?f8;*hOFl{xCjFt9RWI{OhCRJ2UM|*Hf z^HcE1tz2=usi@{wNVfXZ-fBieg!H(1Vt3Eheb9xzct=v>dcer7k9+@?`{efBZ^*|? zeF#@K0f+rv{Sm_dB(oaKyJ&Z4Go9n&0ve2z8RHN=rraJE=4X z0~UFNHAlte$*1*@De&;H)AM7k*myZq;Q$v1EmRN}so%*CG@AU*_-4-qwp}N`{c8Ny zvdfBs#@joW9Zo;q6CQ>R`cd2)*THTMj+e_-Ccx)h%$A!z8h4V@W6}VwIKCI%D^s{; z$$!ZZm^;U2bYQ9U{;(qe-~NtKpM?vczDzywYMqhqeS5gw zLC0~fC})w5nDqCPOc3s7=0ZEt!PKv|5&&m}Qzxn6b2_$R+h}$9pY_J7d&6w;?Tg6T zBlVw4s}}|+cY2~nk}gd?o-ZfgU2HhBIl3%>np|3s|F-byY|vbP&^B3SmfAci!{78; z!JbySk&?ms`DJ@er7@YhOkAZcHg%TVW}mRu#K5Z^)ObQE8v%<;nV&4K?QeUxqT}BF zaO@brt^xY3Z_A+S!+1ozL!~$C5k;-0mfJP`W$pUrlzn8T@x2#fJj6I0@Jz83ap+FR zz~@pK)|wk+9>qP2hY&EokwTpsMApv0_*?pxjzC{J4qRVun6`TRSWh~NXI?sL`a=rG zDw1E4QAHIx4s-!>?PGX9Ag58va<$ z9S;bo1yc{}Up1614E$L>>pSnPT&*!OoPK#$uBZ3`^AI;>Ad8)@#5KD6Vm|ph>z#e= zMM!UOS3og(ffq8MG&;*z;j=OHdx!&CN3|lF3DgxR2r)~6OccLvXZ3t+l95B;=LA4( zhVnG|ne?Rl#NxF8|IYd^1@$DZ#YR+E^?c!Zmq<*ux@H)1$7z;1r^eu*4SH7WG%iSl z9<@FBX`|PvK+SG#r`l)kVdW3nwc@o^t)}F1KYmijA(HkTb}MN&UEywe|Pr$nfaHp<9_V#ZKE+zm7Jn)Vnxi@}zpk_GTXC zZ<5Wo)~s}LFT1ep7C$E%4;1Cg6dHb1{jyFs$r!rm<4hI6z*C<%zBN|05_GdK;f={S z2W^GAfqazoccS(;e4A$#=K>0p`w+b~c%DX(PgU+mM65B+BP^7L+m6-ymI^^=6Ki z>%Fb|JD6K-3ssmZ8~xv*C##lOjRd&+4bM;gl6X0oK&g1`J@mXfhf^XpGod^uaMfUb z)c@`KXAfJZyg8vDLTB1@_*y#_!_I8By|KDMMyY!9*v_xaYfFqK@4)dRePQi}O|K!! zyPPz#mDXgHP@pBGzECMHZ8?F^FTw0?i@Hrih|O-r4>}0Nvr}+>f8sz&5`1~VP-3cp zU|hl*+puc%$}JS>sv|K76~W3u`+MvIuWZgEx$G;YyN@GacF3~B%(^WzpFxz>z@%pD zqo0!N!Chhqn2K7SH@k}~Z7T1jFK#hK>6);A;w8g!k8g+L!=;wLY-hXO2&13qoyt8& zj-P3MR`db`C$^H&Ln=&~G;`CfOTF9+PHb=J7Rh+dRE84t*a9<4+S?^iir6Jt7G9`Z z5&`SGvHwpCOkm_*6L*GP>z&R;zFnp5RtL>R^K5Z6#M?3zXW!b|y59_by)V6g6e8Y2 zUTEZ^=Jvzi#7+{7MA1C_(PoB_6$!Yh4rKL#ZXcA^>!^dP)0PvuR{15VG4Uv`06JE27tex#BQcJqeF&5zyVc?Jivx#tRIWXp%Md`!x@BKLNka?49( zwj_?lq!6JaKr%jyYr?C%9x4)=e#xU>At`eVhvP}Q`2}AkE*vm+YUY^L;+{O)0zaEzQ6TwH0C?oTm zL1$tmb&l@~#X#!s8cP>e_8*-?u6e=#cTxY38voCrEk7$ssA^PPBYVf0m7eR}C}8X{ zCf>x3#7Ngp)VlA%E5@Y%XCD5IkpE_?#JZkYc^cq_E&soK;QyZvKH(3BnH~V%?0PE=lOg zwDnY9ok1BAYPWid`N-YzWdi-eKZ8Ki-FCfV?F=oHskI?czPRDLxqJl~^+Ojly}Wda z9+DDR>BQVEP9@QEke4)MuNG! zSd~i!I@%(n-ogqxv}|Scx$TJ>oJyyG`64{L!NSu#ju{-Vwa%KI)iG{<$4%)J(r^h2 zxPk15%@`39rr3WHMa#}&5#)@h9s-;qEoAyVRh@9zIXJ|vMh493O!svhXf*%$Gqhw- zi`Ga~I}BLSmC$NJ+09C-&RZQ+g{r+EG*=w0h29!GW2wXbT#*}-1Mrm+6_$sjvldX| zHTI@glI;Hg!u159O4(m`Qt;kzeD{ZPL_&LhSbjZscv~4Uv+--+TtfWk-3Gqef~$$z zrzzqy3Tmskxk#4T1cN=F__WxN(&(RGG++tD$uncVfn;C3CFA% zNz%+26lZ}{X}i%BOjk)XyHmUM%AJN<#)Y-=t)Ajb3i?)>JeVNd4nt(oo{jFKohXY%MYA12X3osMuvi+Ez1RV0XpjznH*p%oq5evzjAXC+J z;XJ!PDK^#FcB$V`-Cb%(*&MoHYHbQqa@z|hN4a{j*zOAl8fuTD7N{cRA5yb&;9S0_ z!R!%R$;cTUb-L^7tf~k3(()@n(JFXfSe|898+_}Q`!%m7`T!1DB2DygT&?riAHf8+ zZdCDk@1eT8!voO0R}WEX4C^|FC6=;ugRv1`XO{2!ccewAdMHNEtp8IC$M2kbPE0Lw zN@?n7bFX-~k%>pQ++*VCIjefO-WN~y;$E!4oE!u7m$u)TI<@jsx z@X4g;P~uYoJE7;#n>=a+$z?+Oob!O77T)%35;53>78glk>`5jW^5Imte79&s6xKQ=)wI z>Eg9EylLXY{76uyW{Umt@iOI#n##$m2gB@J`>Z!Z79+is*m P|B`?{)(BI60sr7%EUa?O literal 0 HcmV?d00001 From 9f14be696c55db65deeacff3c0250caf79d90012 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 10:59:48 -0700 Subject: [PATCH 06/54] implement logger and use in agent rollout processor --- .eval_protocol/datasets/2025-08-05.jsonl | 1 + eval_protocol/dataset_logger/__init__.py | 3 + .../dataset_logger/dataset_logger.py | 35 ++ .../local_fs_dataset_logger_adapter.py | 102 ++++ eval_protocol/human_id/__init__.py | 34 ++ eval_protocol/human_id/dictionary.py | 507 ++++++++++++++++++ eval_protocol/models.py | 12 +- .../pytest/default_agent_rollout_processor.py | 21 +- tests/pytest/test_pytest_mcp_url.py | 4 +- tests/test_dataset_logger_signal_handling.py | 148 +++++ 10 files changed, 857 insertions(+), 10 deletions(-) create mode 100644 .eval_protocol/datasets/2025-08-05.jsonl create mode 100644 eval_protocol/dataset_logger/__init__.py create mode 100644 eval_protocol/dataset_logger/dataset_logger.py create mode 100644 eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py create mode 100644 eval_protocol/human_id/__init__.py create mode 100644 eval_protocol/human_id/dictionary.py create mode 100644 tests/test_dataset_logger_signal_handling.py diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl new file mode 100644 index 00000000..0ccfadef --- /dev/null +++ b/.eval_protocol/datasets/2025-08-05.jsonl @@ -0,0 +1 @@ +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and processes.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"inference endpoints deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for more specific deployment management topics:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment configuration scaling Fireworks\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment status monitoring Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"custom model deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Does Fireworks support custom base models?\nLink: https://docs.fireworks.ai/faq-new/models-inference/does-fireworks-support-custom-base-models\nContent: Yes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nDoes Fireworks support custom base models?\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"firectl deployment tool Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management commands and tools:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment commands CLI Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for deployment configuration and management:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment configuration YAML JSON Fireworks\"}"}}]},{"role":"tool","content":"Title: Create a fine-tuning job\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-finetune-job\nContent: Creates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my search results, here's what I can teach you about managing deployments on Fireworks AI:\n\n## Deployment Management on Fireworks AI\n\n### 1. **Deployment Performance Expectations**\n- **Initial deployment**: Should complete within minutes\n- **Scaling from zero**: May experience brief availability delays while the system scales up\n- **Troubleshooting**: If deployment takes over 1 hour, this typically indicates a crash and should be investigated\n- **Best practice**: Monitor deployment status and contact support if deployment times are unusually long\n\n### 2. **Custom Model Deployment**\nFireworks AI supports custom base models through `firectl` - their deployment tool. You can deploy custom models using this command-line interface.\n\n### 3. **Deployment Tools**\n- **firectl**: The primary deployment tool for managing models on Fireworks AI\n- Used for both standard and custom model deployments\n- Supports configuration via YAML files\n\n### 4. **Monitoring and Management**\n- Monitor deployment status regularly\n- Contact support for unusually long deployment times\n- Watch for scaling delays when starting from zero instances\n\n### 5. **Configuration Management**\nDeployments can be configured using YAML configuration files, similar to how fine-tuning jobs are configured.\n\n## Next Steps for Managing Deployments\n\nTo get started with deployment management, you should:\n\n1. **Install firectl**: The Fireworks AI command-line tool\n2. **Prepare your model**: Ensure your model is properly formatted and ready for deployment\n3. **Create deployment configuration**: Use YAML files to define deployment parameters\n4. **Monitor deployment**: Use built-in monitoring tools to track deployment status\n5. **Scale as needed**: Configure auto-scaling based on your traffic patterns\n\nWould you like me to search for more specific information about any of these deployment management aspects, such as specific firectl commands or configuration examples?","tool_calls":[]}],"input_metadata":{"row_id":"feel-might-gaseous-picture"},"created_at":"2025-08-05T10:43:36.343980"} diff --git a/eval_protocol/dataset_logger/__init__.py b/eval_protocol/dataset_logger/__init__.py new file mode 100644 index 00000000..c7cdbf6a --- /dev/null +++ b/eval_protocol/dataset_logger/__init__.py @@ -0,0 +1,3 @@ +from eval_protocol.dataset_logger.local_fs_dataset_logger_adapter import LocalFSDatasetLoggerAdapter + +default_logger = LocalFSDatasetLoggerAdapter() diff --git a/eval_protocol/dataset_logger/dataset_logger.py b/eval_protocol/dataset_logger/dataset_logger.py new file mode 100644 index 00000000..a19f2613 --- /dev/null +++ b/eval_protocol/dataset_logger/dataset_logger.py @@ -0,0 +1,35 @@ +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, List, Optional + +if TYPE_CHECKING: + from eval_protocol.models import EvaluationRow + + +class DatasetLogger(ABC): + """ + Abstract base class for logging EvaluationRow objects. + Implementations should provide methods for storing and retrieving logs. + """ + + @abstractmethod + def log(self, row: "EvaluationRow") -> None: + """ + Store a single EvaluationRow log. + + Args: + row (EvaluationRow): The evaluation row to log. + """ + pass + + @abstractmethod + def read(self, row_id: Optional[str] = None) -> List["EvaluationRow"]: + """ + Retrieve EvaluationRow logs. + + Args: + row_id (Optional[str]): If provided, filter logs by this row_id. + + Returns: + List[EvaluationRow]: List of retrieved evaluation rows. + """ + pass diff --git a/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py b/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py new file mode 100644 index 00000000..23b46383 --- /dev/null +++ b/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py @@ -0,0 +1,102 @@ +from datetime import datetime, timezone +import json +import os +import tempfile +import shutil +from typing import TYPE_CHECKING, List, Optional +from eval_protocol.common_utils import load_jsonl +from eval_protocol.dataset_logger.dataset_logger import DatasetLogger + +if TYPE_CHECKING: + from eval_protocol.models import EvaluationRow + + +class LocalFSDatasetLoggerAdapter(DatasetLogger): + """ + Logger that stores logs in the local filesystem. + """ + + EVAL_PROTOCOL_DIR = ".eval_protocol" + PYTHON_FILES = ["pyproject.toml", "requirements.txt"] + DATASETS_DIR = "datasets" + + def __init__(self): + # recursively look up for a .eval_protocol directory + current_dir = os.path.dirname(os.path.abspath(__file__)) + while current_dir != "/": + if os.path.exists(os.path.join(current_dir, self.EVAL_PROTOCOL_DIR)): + self.log_dir = os.path.join(current_dir, self.EVAL_PROTOCOL_DIR) + break + current_dir = os.path.dirname(current_dir) + + # if not found, recursively look up until a pyproject.toml or requirements.txt is found + current_dir = os.path.dirname(os.path.abspath(__file__)) + while current_dir != "/": + if any(os.path.exists(os.path.join(current_dir, f)) for f in self.PYTHON_FILES): + self.log_dir = os.path.join(current_dir, self.EVAL_PROTOCOL_DIR) + break + current_dir = os.path.dirname(current_dir) + + # get the PWD that this python process is running in + self.log_dir = os.path.join(os.getcwd(), self.EVAL_PROTOCOL_DIR) + + # create the .eval_protocol directory if it doesn't exist + os.makedirs(self.log_dir, exist_ok=True) + + # create the datasets subdirectory + self.datasets_dir = os.path.join(self.log_dir, self.DATASETS_DIR) + os.makedirs(self.datasets_dir, exist_ok=True) + + # ensure that log file exists + if not os.path.exists(self.jsonl_path): + with open(self.jsonl_path, "w") as f: + f.write("") + + @property + def current_date(self) -> str: + # Use UTC timezone to be consistent across local device/locations/CI + return datetime.now(timezone.utc).strftime("%Y-%m-%d") + + @property + def jsonl_path(self) -> str: + return os.path.join(self.datasets_dir, f"{self.current_date}.jsonl") + + def log(self, row: "EvaluationRow") -> None: + """Log a row, updating existing row with same ID or appending new row.""" + row_id = row.input_metadata.row_id + + # Check if row with this ID already exists + if os.path.exists(self.jsonl_path): + with open(self.jsonl_path, "r") as f: + lines = f.readlines() + + # Find the line with matching ID + for i, line in enumerate(lines): + try: + line_data = json.loads(line.strip()) + if line_data["input_metadata"]["row_id"] == row_id: + # Update existing row + lines[i] = row.model_dump_json(exclude_none=True) + os.linesep + with open(self.jsonl_path, "w") as f: + f.writelines(lines) + return + except json.JSONDecodeError: + continue + + # If no existing row found, append new row + with open(self.jsonl_path, "a") as f: + f.write(row.model_dump_json(exclude_none=True) + os.linesep) + + def read(self, row_id: Optional[str] = None) -> List["EvaluationRow"]: + """Read rows from the JSONL file.""" + if not os.path.exists(self.jsonl_path): + return [] + + data = load_jsonl(self.jsonl_path) + rows = [EvaluationRow(**r) for r in data] + + if row_id: + # Filter by row_id if specified + return [row for row in rows if row.id == row_id] + else: + return rows diff --git a/eval_protocol/human_id/__init__.py b/eval_protocol/human_id/__init__.py new file mode 100644 index 00000000..a48460f2 --- /dev/null +++ b/eval_protocol/human_id/__init__.py @@ -0,0 +1,34 @@ +import random +import itertools +from typing import Hashable +from . import dictionary + +__all__ = ["generate_id"] + +system_random = random.SystemRandom() + + +def generate_id(separator="-", seed: int | float | str | bytes | bytearray | None = None, word_count=4) -> str: + """ + Generate a human readable ID + + :param separator: The string to use to separate words + :param seed: The seed to use. The same seed will produce the same ID + :param word_count: The number of words to use. Minimum of 3. + :return: A human readable ID + """ + if word_count < 3: + raise ValueError("word_count cannot be lower than 3") + + random_obj = system_random + if seed: + random_obj = random.Random(seed) + + parts = {dictionary.verbs: 1, dictionary.adjectives: 1, dictionary.nouns: 1} + + for _ in range(3, word_count): + parts[random_obj.choice(list(parts.keys()))] += 1 + + parts = itertools.chain.from_iterable(random_obj.sample(part, count) for part, count in parts.items()) + + return separator.join(parts) diff --git a/eval_protocol/human_id/dictionary.py b/eval_protocol/human_id/dictionary.py new file mode 100644 index 00000000..23dca4ae --- /dev/null +++ b/eval_protocol/human_id/dictionary.py @@ -0,0 +1,507 @@ +nouns = ( + "time", + "year", + "people", + "way", + "day", + "man", + "thing", + "woman", + "life", + "child", + "world", + "school", + "state", + "family", + "student", + "group", + "country", + "problem", + "hand", + "part", + "place", + "case", + "week", + "company", + "system", + "program", + "question", + "work", + "government", + "number", + "night", + "point", + "home", + "water", + "room", + "mother", + "area", + "money", + "story", + "fact", + "month", + "lot", + "right", + "study", + "book", + "eye", + "job", + "word", + "business", + "issue", + "side", + "kind", + "head", + "house", + "service", + "friend", + "father", + "power", + "hour", + "game", + "line", + "end", + "member", + "law", + "car", + "city", + "community", + "name", + "president", + "team", + "minute", + "idea", + "kid", + "body", + "information", + "back", + "parent", + "face", + "others", + "level", + "office", + "door", + "health", + "person", + "art", + "war", + "history", + "party", + "result", + "change", + "morning", + "reason", + "research", + "girl", + "guy", + "moment", + "air", + "teacher", + "force", + "education", + # 50 more, no repeats + "music", + "technology", + "science", + "nature", + "computer", + "internet", + "software", + "hardware", + "network", + "website", + "phone", + "camera", + "movie", + "film", + "picture", + "painting", + "drawing", + "letter", + "message", + "email", + "news", + "media", + "magazine", + "newspaper", + "radio", + "television", + "video", + "song", + "album", + "concert", + "festival", + "event", + "meeting", + "conference", + "project", + "plan", + "goal", + "dream", + "hope", + "wish", + "desire", + "fear", + "love", + "hate", + "anger", + "joy", + "pleasure", + "pain", + "thought", + "memory", + "experience", + "adventure", +) + +adjectives = ( + "other", + "new", + "good", + "high", + "old", + "great", + "big", + "american", + "small", + "large", + "national", + "young", + "different", + "black", + "long", + "little", + "important", + "political", + "bad", + "white", + "real", + "best", + "right", + "social", + "only", + "public", + "sure", + "low", + "early", + "able", + "human", + "local", + "late", + "hard", + "major", + "better", + "economic", + "strong", + "possible", + "whole", + "free", + "military", + "true", + "federal", + "international", + "full", + "special", + "easy", + "clear", + "recent", + "certain", + "personal", + "open", + "red", + "difficult", + "available", + "likely", + "short", + "single", + "medical", + "current", + "wrong", + "private", + "past", + "foreign", + "fine", + "common", + "poor", + "natural", + "significant", + "similar", + "hot", + "dead", + "central", + "happy", + "serious", + "ready", + "simple", + "left", + "physical", + "general", + "environmental", + "financial", + "blue", + "democratic", + "dark", + "various", + "entire", + "close", + "legal", + "religious", + "cold", + "final", + "main", + "green", + "nice", + "huge", + "popular", + "traditional", + "cultural", + # 50 more, no repeats + "modern", + "ancient", + "quick", + "slow", + "quiet", + "loud", + "brave", + "shy", + "friendly", + "hostile", + "gentle", + "rough", + "soft", + "sharp", + "smooth", + "bitter", + "sweet", + "salty", + "spicy", + "fresh", + "stale", + "clean", + "dirty", + "messy", + "tidy", + "rich", + "poorly", + "famous", + "unknown", + "visible", + "invisible", + "empty", + "fullest", + "solid", + "liquid", + "gaseous", + "dry", + "wet", + "warm", + "cool", + "safe", + "dangerous", + "unfriendly", + "creative", + "logical", + "emotional", + "rational", + "spiritual", + "practical", + "theoretical", +) + +verbs = ( + "be", + "have", + "do", + "say", + "go", + "can", + "get", + "would", + "make", + "know", + "will", + "think", + "take", + "see", + "come", + "could", + "want", + "look", + "use", + "find", + "give", + "tell", + "work", + "may", + "should", + "call", + "try", + "ask", + "need", + "feel", + "become", + "leave", + "put", + "mean", + "keep", + "let", + "begin", + "seem", + "help", + "talk", + "turn", + "start", + "might", + "show", + "hear", + "play", + "run", + "move", + "like", + "live", + "believe", + "hold", + "bring", + "happen", + "must", + "write", + "provide", + "sit", + "stand", + "lose", + "pay", + "meet", + "include", + "continue", + "set", + "learn", + "change", + "lead", + "understand", + "watch", + "follow", + "stop", + "create", + "speak", + "read", + "allow", + "add", + "spend", + "grow", + "open", + "walk", + "win", + "offer", + "remember", + "love", + "consider", + "appear", + "buy", + "wait", + "serve", + "die", + "send", + "expect", + "build", + "stay", + "fall", + "cut", + "reach", + "kill", + "remain", + "explain", + "discover", + "accept", + "prepare", + "improve", + "describe", + "recognize", + "introduce", + "represent", + "reduce", + "apply", + "avoid", + "imagine", + "express", + "suppose", + "achieve", + "choose", + "touch", + "identify", + "manage", + "protect", + "require", + "suggest", + "prefer", + "depend", + "encourage", + "reflect", + "compare", + "arrive", + "support", + "prove", + "contain", + "claim", + "enjoy", + "control", + "treat", + "mention", + "wonder", + "wish", + "affect", + "determine", + "indicate", + "relate", + "refer", + "respond", + "assume", + "replace", + "miss", + "design", + # 50 more, no repeats + "explore", + "connect", + "disconnect", + "analyze", + "organize", + "arrange", + "collect", + "deliver", + "receive", + "observe", + "record", + "report", + "review", + "select", + "sort", + "store", + "retrieve", + "update", + "upgrade", + "download", + "upload", + "install", + "remove", + "delete", + "repair", + "fix", + "break", + "assemble", + "disassemble", + "construct", + "destroy", + "invent", + "exploit", + "investigate", + "monitor", + "predict", + "forecast", + "estimate", + "calculate", + "measure", + "test", + "experiment", + "validate", + "verify", + "confirm", +) diff --git a/eval_protocol/models.py b/eval_protocol/models.py index ba227c22..0962bdab 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Any, Dict, List, Literal, Optional, Union from openai.types import CompletionUsage @@ -7,6 +8,8 @@ ) from pydantic import BaseModel, ConfigDict, Field +from eval_protocol.human_id import generate_id + class ChatCompletionContentPartTextParam(BaseModel): text: str = Field(..., description="The text content.") @@ -187,7 +190,7 @@ class InputMetadata(BaseModel): model_config = ConfigDict(extra="allow") - row_id: Optional[str] = Field(None, description="Unique string to ID the row") + row_id: str = Field(default_factory=generate_id, description="Unique string to ID the row") completion_params: Optional[CompletionParams] = Field(None, description="Completion endpoint parameters used") dataset_info: Optional[Dict[str, Any]] = Field( None, description="Dataset row details: seed, system_prompt, environment_context, etc" @@ -216,8 +219,9 @@ class EvaluationRow(BaseModel): ) # Input-related metadata (grouped together for cleaner organization) - input_metadata: Optional[InputMetadata] = Field( - default=None, description="Metadata related to the input (dataset info, model config, session data, etc.)." + input_metadata: InputMetadata = Field( + default_factory=InputMetadata, + description="Metadata related to the input (dataset info, model config, session data, etc.).", ) # Ground truth reference (moved from EvaluateResult to top level) @@ -235,6 +239,8 @@ class EvaluationRow(BaseModel): default=None, description="Token usage statistics from LLM calls during execution." ) + created_at: datetime = Field(default_factory=datetime.now, description="The timestamp when the row was created.") + def is_trajectory_evaluation(self) -> bool: """ Returns True if this represents a trajectory evaluation (has step_outputs), diff --git a/eval_protocol/pytest/default_agent_rollout_processor.py b/eval_protocol/pytest/default_agent_rollout_processor.py index 00a61692..bb99834f 100644 --- a/eval_protocol/pytest/default_agent_rollout_processor.py +++ b/eval_protocol/pytest/default_agent_rollout_processor.py @@ -12,6 +12,7 @@ from eval_protocol.mcp.mcp_multi_client import MCPMultiClient from eval_protocol.models import EvaluationRow, Message from eval_protocol.pytest.types import Dataset, RolloutProcessorConfig +from eval_protocol.dataset_logger import default_logger class Agent: @@ -21,7 +22,7 @@ class Agent: def __init__(self, model: str, initial_messages: list[Message], config_path: str): self.model = model - self.messages: list[Message] = initial_messages + self.evaluation_row: EvaluationRow = EvaluationRow(messages=initial_messages) self._policy = LiteLLMPolicy(model_id=model) self.mcp_client = MCPMultiClient(config_path=config_path) if config_path else None self.tools: Union[List[ChatCompletionToolParam], NotGiven] = NOT_GIVEN @@ -35,6 +36,14 @@ async def _get_tools(self) -> Optional[List[ChatCompletionToolParam]]: self.tools = await self.mcp_client.get_available_tools() if self.mcp_client else None return self.tools + @property + def messages(self) -> list[Message]: + return self.evaluation_row.messages + + def append_message_and_log(self, message: Message): + self.messages.append(message) + default_logger.log(self.evaluation_row) + async def call_agent(self) -> str: """ Call the assistant with the user query. @@ -42,7 +51,7 @@ async def call_agent(self) -> str: tools = await self._get_tools() if self.mcp_client else None message = await self._call_model(self.messages, tools) - self.messages.append(message) + self.append_message_and_log(message) if message["tool_calls"]: # Create tasks for all tool calls to run them in parallel tool_tasks = [] @@ -61,7 +70,7 @@ async def call_agent(self) -> str: # Add all tool results to messages (they will be in the same order as tool_calls) for tool_call, (tool_call_id, content) in zip(message["tool_calls"], tool_results): - self.messages.append( + self.append_message_and_log( Message( role="tool", content=content, @@ -90,7 +99,7 @@ async def _execute_tool_call(self, tool_call_id: str, tool_name: str, tool_args_ def _get_content_from_tool_result(self, tool_result: CallToolResult) -> List[TextContent]: if tool_result.structuredContent: - return json.dumps(tool_result.structuredContent) + return [TextContent(text=json.dumps(tool_result.structuredContent), type="text")] if not all(isinstance(content, TextContent) for content in tool_result.content): raise NotImplementedError("Non-text content is not supported yet") return tool_result.content[0].text @@ -104,7 +113,9 @@ async def default_agent_rollout_processor( agent = Agent(model=config.model, initial_messages=row.messages, config_path=config.mcp_config_path) await agent.setup() await agent.call_agent() - dataset.append(EvaluationRow(messages=agent.messages, ground_truth=row.ground_truth)) + dataset.append( + EvaluationRow(ground_truth=row.ground_truth, **agent.evaluation_row.model_dump(exclude_none=True)) + ) if agent.mcp_client: await agent.mcp_client.cleanup() return dataset diff --git a/tests/pytest/test_pytest_mcp_url.py b/tests/pytest/test_pytest_mcp_url.py index 78258199..2a1c1cfc 100644 --- a/tests/pytest/test_pytest_mcp_url.py +++ b/tests/pytest/test_pytest_mcp_url.py @@ -31,12 +31,12 @@ def test_pytest_mcp_url(row: EvaluationRow) -> EvaluationRow: if len(tool_calls) == 0: row.evaluation_result = EvaluateResult( score=0, - feedback="No tool calls made", + reason="No tool calls made", ) return row row.evaluation_result = EvaluateResult( score=1, - feedback="At least one tool call was made", + reason="At least one tool call was made", ) return row diff --git a/tests/test_dataset_logger_signal_handling.py b/tests/test_dataset_logger_signal_handling.py new file mode 100644 index 00000000..105f6817 --- /dev/null +++ b/tests/test_dataset_logger_signal_handling.py @@ -0,0 +1,148 @@ +import os +import signal +import tempfile +import time +import json +from unittest.mock import patch +import pytest + +from eval_protocol.dataset_logger.local_fs_dataset_logger_adapter import LocalFSDatasetLoggerAdapter +from eval_protocol.models import EvaluationRow + + +class TestLocalFSDatasetLoggerAdapterSignalHandling: + """Test that the dataset logger properly handles termination signals.""" + + def setup_method(self): + """Set up a temporary directory for testing.""" + self.temp_dir = tempfile.mkdtemp() + self.original_cwd = os.getcwd() + os.chdir(self.temp_dir) + + # Create a mock .eval_protocol directory + os.makedirs(".eval_protocol/datasets", exist_ok=True) + + def teardown_method(self): + """Clean up after tests.""" + os.chdir(self.original_cwd) + import shutil + shutil.rmtree(self.temp_dir, ignore_errors=True) + + def test_signal_handlers_registered(self): + """Test that signal handlers are properly registered.""" + logger = LocalFSDatasetLoggerAdapter() + + # Check that signal handlers are registered + assert signal.getsignal(signal.SIGINT) != signal.SIG_DFL + assert signal.getsignal(signal.SIGTERM) != signal.SIG_DFL + + def test_index_saved_on_sigint(self): + """Test that index is saved when SIGINT is received.""" + logger = LocalFSDatasetLoggerAdapter() + + # Create a test row and log it + test_row = EvaluationRow( + id="test_id_1", + prompt="test prompt", + response="test response", + score=0.8 + ) + logger.log(test_row) + + # Verify index is dirty + assert logger._index_dirty is True + + # Simulate SIGINT + with patch('sys.exit') as mock_exit: + with patch('builtins.print') as mock_print: + # Get the signal handler + sigint_handler = signal.getsignal(signal.SIGINT) + # Call it directly + sigint_handler(signal.SIGINT, None) + + # Verify flush was called and exit was called + assert not logger._index_dirty # Index should be flushed + mock_exit.assert_called_once_with(0) + mock_print.assert_called() + + def test_index_saved_on_sigterm(self): + """Test that index is saved when SIGTERM is received.""" + logger = LocalFSDatasetLoggerAdapter() + + # Create a test row and log it + test_row = EvaluationRow( + id="test_id_2", + prompt="test prompt", + response="test response", + score=0.9 + ) + logger.log(test_row) + + # Verify index is dirty + assert logger._index_dirty is True + + # Simulate SIGTERM + with patch('sys.exit') as mock_exit: + with patch('builtins.print') as mock_print: + # Get the signal handler + sigterm_handler = signal.getsignal(signal.SIGTERM) + # Call it directly + sigterm_handler(signal.SIGTERM, None) + + # Verify flush was called and exit was called + assert not logger._index_dirty # Index should be flushed + mock_exit.assert_called_once_with(0) + mock_print.assert_called() + + def test_force_flush_method(self): + """Test the force_flush method.""" + logger = LocalFSDatasetLoggerAdapter() + + # Create a test row and log it + test_row = EvaluationRow( + id="test_id_3", + prompt="test prompt", + response="test response", + score=0.7 + ) + logger.log(test_row) + + # Verify index is dirty + assert logger._index_dirty is True + + # Force flush + logger.force_flush() + + # Verify index is no longer dirty + assert logger._index_dirty is False + + # Verify index file exists and contains the expected data + assert os.path.exists(logger.index_path) + with open(logger.index_path, 'r') as f: + index_data = json.load(f) + assert "test_id_3" in index_data + + def test_flush_error_handling(self): + """Test that flush errors are handled gracefully.""" + logger = LocalFSDatasetLoggerAdapter() + + # Create a test row and log it + test_row = EvaluationRow( + id="test_id_4", + prompt="test prompt", + response="test response", + score=0.6 + ) + logger.log(test_row) + + # Mock _save_index_to_disk to raise an exception + with patch.object(logger, '_save_index_to_disk', side_effect=Exception("Test error")): + with patch('builtins.print') as mock_print: + logger.flush() + + # Verify error was logged but not raised + mock_print.assert_called() + assert "Warning: Failed to flush index to disk" in mock_print.call_args[0][0] + + # Verify index is still dirty (so it can be retried) + assert logger._index_dirty is True \ No newline at end of file From 4eeb2c1da2ff20327db43616fed3cea8bcf4c07e Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 11:04:10 -0700 Subject: [PATCH 07/54] log rows after evals too --- .eval_protocol/datasets/2025-08-05.jsonl | 2 ++ eval_protocol/pytest/evaluation_test.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl index 0ccfadef..6053d7fc 100644 --- a/.eval_protocol/datasets/2025-08-05.jsonl +++ b/.eval_protocol/datasets/2025-08-05.jsonl @@ -1 +1,3 @@ {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and processes.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"inference endpoints deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for more specific deployment management topics:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment configuration scaling Fireworks\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment status monitoring Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"custom model deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Does Fireworks support custom base models?\nLink: https://docs.fireworks.ai/faq-new/models-inference/does-fireworks-support-custom-base-models\nContent: Yes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nDoes Fireworks support custom base models?\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"firectl deployment tool Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management commands and tools:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment commands CLI Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for deployment configuration and management:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment configuration YAML JSON Fireworks\"}"}}]},{"role":"tool","content":"Title: Create a fine-tuning job\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-finetune-job\nContent: Creates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my search results, here's what I can teach you about managing deployments on Fireworks AI:\n\n## Deployment Management on Fireworks AI\n\n### 1. **Deployment Performance Expectations**\n- **Initial deployment**: Should complete within minutes\n- **Scaling from zero**: May experience brief availability delays while the system scales up\n- **Troubleshooting**: If deployment takes over 1 hour, this typically indicates a crash and should be investigated\n- **Best practice**: Monitor deployment status and contact support if deployment times are unusually long\n\n### 2. **Custom Model Deployment**\nFireworks AI supports custom base models through `firectl` - their deployment tool. You can deploy custom models using this command-line interface.\n\n### 3. **Deployment Tools**\n- **firectl**: The primary deployment tool for managing models on Fireworks AI\n- Used for both standard and custom model deployments\n- Supports configuration via YAML files\n\n### 4. **Monitoring and Management**\n- Monitor deployment status regularly\n- Contact support for unusually long deployment times\n- Watch for scaling delays when starting from zero instances\n\n### 5. **Configuration Management**\nDeployments can be configured using YAML configuration files, similar to how fine-tuning jobs are configured.\n\n## Next Steps for Managing Deployments\n\nTo get started with deployment management, you should:\n\n1. **Install firectl**: The Fireworks AI command-line tool\n2. **Prepare your model**: Ensure your model is properly formatted and ready for deployment\n3. **Create deployment configuration**: Use YAML files to define deployment parameters\n4. **Monitor deployment**: Use built-in monitoring tools to track deployment status\n5. **Scale as needed**: Configure auto-scaling based on your traffic patterns\n\nWould you like me to search for more specific information about any of these deployment management aspects, such as specific firectl commands or configuration examples?","tool_calls":[]}],"input_metadata":{"row_id":"feel-might-gaseous-picture"},"created_at":"2025-08-05T10:43:36.343980"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms and features.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment Fireworks AI platform features\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for specific deployment management concepts like scaling, monitoring, and configuration.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment scaling monitoring configuration\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more comprehensive deployment management information including deployment methods and best practices.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment methods best practices model serving\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for specific deployment commands and API endpoints.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI API deployment endpoints commands CLI\"}"}}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for deployment configuration and management features.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment configuration model settings\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management topics like autoscaling, load balancing, and deployment lifecycle.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI autoscaling load balancing deployment lifecycle management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the information I've gathered, let me provide you with a comprehensive guide on managing deployments on Fireworks AI:\n\n## Managing Deployments on Fireworks AI\n\n### 1. Deployment Performance Expectations\n\n**Initial Deployment:**\n- Should complete within minutes\n- Monitor deployment status actively\n\n**Scaling from Zero:**\n- May experience brief availability delays while the system scales up\n- This is normal behavior when scaling from zero instances\n\n**Troubleshooting:**\n- If deployment takes over 1 hour, this typically indicates a crash\n- Contact support if deployment times are unusually long\n\n### 2. Key Deployment Management Commands\n\nHere are the essential commands you'll need:\n\n```bash\n# Check deployment status\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/status\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Monitor scaling events\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/scaling\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Update deployment configuration\ncurl -X PATCH \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"min_instances\": 2,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7\n }'\n```\n\n### 3. Deployment Configuration Management\n\n**Basic Configuration:**\n```python\nimport fireworks.client\n\n# Configure deployment settings\ndeployment_config = {\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"deployment_name\": \"my-production-model\",\n \"min_instances\": 1,\n \"max_instances\": 5,\n \"scaling_threshold\": 0.8,\n \"timeout\": 30\n}\n\n# Create deployment\nresponse = fireworks.client.deployments.create(\n model=deployment_config[\"model\"],\n deployment_name=deployment_config[\"deployment_name\"],\n min_instances=deployment_config[\"min_instances\"],\n max_instances=deployment_config[\"max_instances\"]\n)\n```\n\n### 4. Monitoring and Observability\n\n**Set up monitoring:**\n```python\nimport requests\nimport time\n\ndef monitor_deployment_health(deployment_id):\n \"\"\"Monitor deployment health and scaling events\"\"\"\n url = f\"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/metrics\"\n headers = {\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n \n response = requests.get(url, headers=headers)\n metrics = response.json()\n \n return {\n \"cpu_utilization\": metrics.get(\"cpu_utilization\"),\n \"memory_usage\": metrics.get(\"memory_usage\"),\n \"active_instances\": metrics.get(\"active_instances\"),\n \"request_count\": metrics.get(\"request_count\"),\n \"error_rate\": metrics.get(\"error_rate\")\n }\n\n# Continuous monitoring loop\nwhile True:\n health = monitor_deployment_health(\"your-deployment-id\")\n print(f\"Active instances: {health['active_instances']}\")\n print(f\"CPU utilization: {health['cpu_utilization']}%\")\n time.sleep(60) # Check every minute\n```\n\n### 5. Autoscaling Configuration\n\n**Configure autoscaling parameters:**\n```json\n{\n \"autoscaling\": {\n \"min_instances\": 1,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7,\n \"scale_up_cooldown\": 60,\n \"scale_down_cooldown\": 300,\n \"metrics\": {\n \"cpu\": {\n \"target\": 70,\n \"type\": \"Utilization\"\n },\n \"memory\": {\n \"target\": 80,\n \"type\": \"Utilization\"\n }\n }\n }\n}\n```\n\n### 6. Deployment Lifecycle Management\n\n**Rolling updates:**\n```bash\n# Perform rolling update without downtime\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/update\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"strategy\": \"rolling\",\n \"max_unavailable\": 1,\n \"max_surge\": 1,\n \"new_config\": {\n \"image\": \"new-model-version:latest\",\n \"resources\": {\n \"cpu\": \"2\",\n \"memory\": \"4Gi\"\n }\n }\n }'\n```\n\n### 7. Best Practices for Deployment Management\n\n1. **Health Checks:**\n```python\ndef deployment_health_check(endpoint):\n \"\"\"Perform health check on deployment\"\"\"\n try:\n response = requests.get(\n f\"{endpoint}/health\",\n timeout=5,\n headers={\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n )\n return response.status_code == 200\n except:\n return False\n```\n\n2. **Resource Management:**\n```yaml\n# Recommended resource allocation\nresources:\n requests:\n cpu: 1000m\n memory: 2Gi\n limits:\n cpu: 2000m\n memory: 4Gi\n```\n\n3. **Monitoring Setup:**\n```python\n# Set up alerts for critical metrics\nalerts = {\n \"high_error_rate\": lambda x: x > 0.05,\n \"high_latency\": lambda x: x > 1000,\n \"low_availability\": lambda x: x < 0.99\n}\n```\n\n### 8. Deployment Rollback\n\n**Rollback to previous version:**\n```bash\n# Rollback deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/rollback\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"revision\": \"previous\",\n \"reason\": \"performance degradation\"\n }'\n```\n\n### 9. Cost Optimization\n\n**Set up cost monitoring:**\n```python\ndef calculate_deployment_cost(instance_type, hours_running):\n \"\"\"Calculate deployment costs\"\"\"\n pricing = {\n \"small\": 0.05, # per hour\n \"medium\": 0.10, # per hour\n \"large\": 0.20 # per hour\n }\n return pricing.get(instance_type, 0.10) * hours_running\n```\n\n### 10. Troubleshooting Common Issues\n\n**Deployment stuck:**\n```bash\n# Check deployment logs\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/logs\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Restart deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/restart\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\nThis comprehensive guide covers the key aspects of managing deployments on Fireworks AI. Start with basic monitoring and gradually implement more advanced features like autoscaling and rolling updates as your needs grow.","tool_calls":[]}],"input_metadata":{"row_id":"identify-be-unfriendly-girl"},"created_at":"2025-08-05T10:59:52.732744"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployments management create update delete scale\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"create deployment configuration scaling replicas\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Replica count (horizontal scaling)\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: The number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment management CLI commands create update list\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment configuration parameters GPU memory CPU firectl\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Which accelerator/GPU should I use?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/which-acceleratorgpu-should-i-use\nContent: It depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nWhich accelerator/GPU should I use?\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"list deployments get deployment status update deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl list deployments get deployment configuration examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"get deployment status check deployment health API endpoint\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: This endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment lifecycle states status monitoring health checks\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: Check Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment commands examples create list update delete\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management tutorial examples firectl commands\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, let me provide you with a comprehensive guide on managing deployments on Fireworks. I'll cover the key aspects including creation, configuration, scaling, monitoring, and deletion.\n\n## Managing Deployments on Fireworks: Complete Guide\n\n### 1. Prerequisites and Setup\n\nBefore managing deployments, ensure your account ID is properly configured to avoid \"invalid id\" errors:\n\n```bash\n# Configure your account ID\nexport FIREWORKS_ACCOUNT_ID=\"your-account-id\"\n```\n\n### 2. Creating Deployments\n\n#### Basic Deployment Creation\n```bash\n# Create a basic deployment\nfirectl create deployment \n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 5 \\\n --accelerator-type A100 \\\n --accelerator-count 1\n```\n\n#### Advanced Deployment Configuration\n```bash\n# Create deployment with comprehensive settings\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --display-name \"My Production Model\" \\\n --description \"High-performance deployment for production workloads\"\n```\n\n### 3. Deployment Scaling Configuration\n\n#### Horizontal Scaling (Replica Management)\n```bash\n# Auto-scaling configuration\nfirectl create deployment \\\n --min-replica-count 0 \\ # Scale to zero when unused\n --max-replica-count 10 \\ # Maximum replicas\n --autoscaling-policy.scale-up-window \"60s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"600s\"\n```\n\n#### Fixed Scaling\n```bash\n# Fixed number of replicas\nfirectl create deployment \\\n --min-replica-count 3 \\\n --max-replica-count 3 # Fixed at 3 replicas\n```\n\n### 4. GPU and Resource Configuration\n\n#### GPU Selection Guide\n- **A100**: Cost-effective for low-volume use cases\n- **H100**: Highest throughput for high-volume use cases\n- **H200**: Recommended for large models (DeepSeek V3/R1)\n- **MI300X**: Highest memory capacity, best for large models\n\n```bash\n# Different GPU configurations\nfirectl create deployment \\\n --accelerator-type A100 \\\n --accelerator-count 1\n\nfirectl create deployment \\\n --accelerator-type H100 \\\n --accelerator-count 8 # For large models like Llama 405B\n```\n\n### 5. Listing and Monitoring Deployments\n\n#### List All Deployments\n```bash\n# List all deployments in your account\nfirectl list deployments\n\n# Get specific deployment details\nfirectl get deployment \n```\n\n#### API-based Monitoring\n```bash\n# Check deployment status via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 6. Updating Deployments\n\n#### Update Configuration\n```bash\n# Update deployment via API\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 5,\n \"maxReplicaCount\": 10,\n \"displayName\": \"Updated Production Model\",\n \"description\": \"Increased capacity for higher load\"\n }'\n```\n\n#### Common Update Scenarios\n```bash\n# Scale up for increased demand\nfirectl update deployment \\\n --min-replica-count 5 \\\n --max-replica-count 15\n\n# Update display name and description\nfirectl update deployment \\\n --display-name \"Production Llama 3.1 70B\" \\\n --description \"Main production deployment for customer service\"\n```\n\n### 7. Deployment Lifecycle Management\n\n#### Deployment States\n- **STATE_UNSPECIFIED**: Initial state\n- **CREATING**: Deployment is being created\n- **RUNNING**: Deployment is active and serving requests\n- **UPDATING**: Configuration is being updated\n- **DELETING**: Deployment is being deleted\n- **ERROR**: Deployment encountered an error\n\n#### Health Monitoring\n```bash\n# Check deployment health\nfirectl get deployment --watch\n\n# Monitor via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" | jq '.status'\n```\n\n### 8. Deleting Deployments\n\n#### Soft Deletion (Default)\n```bash\n# Delete deployment (soft delete)\nfirectl delete deployment \n\n# API-based deletion\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n#### Hard Deletion\n```bash\n# Force deletion ignoring checks\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}?hard=true&ignoreChecks=true\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 9. Best Practices\n\n#### Cost Optimization\n```bash\n# Enable scale-to-zero for development environments\nfirectl create deployment \\\n --min-replica-count 0 \\\n --max-replica-count 2 \\\n --accelerator-type A100\n\n# Use reserved capacity for production\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --reserved-capacity true\n```\n\n#### Monitoring Setup\n```bash\n# Set up alerts for deployment health\n# Monitor key metrics:\n# - Replica count\n# - Request latency\n# - Error rates\n# - GPU utilization\n```\n\n### 10. Troubleshooting Common Issues\n\n#### Invalid ID Errors\n```bash\n# Fix account ID configuration\nexport FIREWORKS_ACCOUNT_ID=$(firectl get account | jq -r '.id')\necho \"Account ID: $FIREWORKS_ACCOUNT_ID\"\n```\n\n#### Scaling Issues\n```bash\n# Check for GPU stockouts\nfirectl get deployment --verbose\n\n# Verify resource availability\nfirectl list available-resources --region us-central1\n```\n\n### Complete Example: Production Deployment\n\n```bash\n#!/bin/bash\n# Production deployment script\n\nMODEL_NAME=\"llama-3.1-70b-instruct\"\nDEPLOYMENT_NAME=\"prod-llama-70b-$(date +%Y%m%d)\"\n\n# Create production deployment\nfirectl create deployment $MODEL_NAME \\\n --display-name $DEPLOYMENT_NAME \\\n --description \"Production Llama 3.1 70B for customer service\" \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --autoscaling-policy.scale-up-window \"30s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"1800s\"\n\n# Get deployment ID\nDEPLOYMENT_ID=$(firectl list deployments | grep $DEPLOYMENT_NAME | awk '{print $1}')\n\n# Monitor deployment status\necho \"Monitoring deployment: $DEPLOYMENT_ID\"\nfirectl get deployment $DEPLOYMENT_ID --watch\n```\n\nThis comprehensive guide covers all aspects of managing deployments on Fireworks, from basic creation to advanced scaling and monitoring strategies.","tool_calls":[]}],"input_metadata":{"row_id":"ask-calculate-final-president"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:02:19.141203"} diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index b8387a7a..d72a83f1 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -1,6 +1,7 @@ import inspect from typing import Any, Callable, Dict, List, Optional +from eval_protocol.dataset_logger import default_logger from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter import pytest @@ -33,7 +34,7 @@ def evaluation_test( model: List[ModelParam], input_messages: Optional[List[InputMessagesParam]] = None, input_dataset: Optional[List[DatasetPathParam]] = None, - dataset_adapter: Optional[Callable[[List[Dict[str, Any]]], Dataset]] = default_dataset_adapter, + dataset_adapter: Callable[[List[Dict[str, Any]]], Dataset] = default_dataset_adapter, rollout_input_params: Optional[List[RolloutInputParam]] = None, rollout_processor: RolloutProcessor = default_no_op_rollout_processor, evaluation_test_kwargs: Optional[List[EvaluationInputParam]] = None, @@ -147,14 +148,18 @@ def generate_combinations(): for etk in kwargs: # if no dataset and no messages, raise an error if ds is None and im is None: - raise ValueError("No dataset or messages provided. Please provide at least one of input_dataset or input_messages.") + raise ValueError( + "No dataset or messages provided. Please provide at least one of input_dataset or input_messages." + ) combinations.append((m, ds, ip, im, etk)) return combinations combinations = generate_combinations() if len(combinations) == 0: - raise ValueError("No combinations of parameters were found. Please provide at least a model and one of input_dataset or input_messages.") + raise ValueError( + "No combinations of parameters were found. Please provide at least a model and one of input_dataset or input_messages." + ) # Create parameter tuples for pytest.mark.parametrize param_tuples = [] @@ -250,6 +255,9 @@ def wrapper_body(**kwargs): ) all_results.extend(results) + for r in all_results: + default_logger.log(r) + scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] agg_score = aggregate(scores, aggregation_method) if threshold_of_success is not None: @@ -347,7 +355,6 @@ def dual_mode_wrapper(*args, **kwargs): import functools functools.update_wrapper(dual_mode_wrapper, pytest_wrapper) - dual_mode_wrapper.original_evaluation_test_func = test_func return dual_mode_wrapper From 290714fffb58677be72526d001736df82caad04a Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 11:07:06 -0700 Subject: [PATCH 08/54] add data --- .eval_protocol/datasets/2025-08-05.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl index 6053d7fc..76f60dad 100644 --- a/.eval_protocol/datasets/2025-08-05.jsonl +++ b/.eval_protocol/datasets/2025-08-05.jsonl @@ -1,3 +1,4 @@ {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and processes.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"inference endpoints deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for more specific deployment management topics:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment configuration scaling Fireworks\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment status monitoring Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"custom model deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Does Fireworks support custom base models?\nLink: https://docs.fireworks.ai/faq-new/models-inference/does-fireworks-support-custom-base-models\nContent: Yes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nDoes Fireworks support custom base models?\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"firectl deployment tool Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management commands and tools:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment commands CLI Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for deployment configuration and management:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment configuration YAML JSON Fireworks\"}"}}]},{"role":"tool","content":"Title: Create a fine-tuning job\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-finetune-job\nContent: Creates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my search results, here's what I can teach you about managing deployments on Fireworks AI:\n\n## Deployment Management on Fireworks AI\n\n### 1. **Deployment Performance Expectations**\n- **Initial deployment**: Should complete within minutes\n- **Scaling from zero**: May experience brief availability delays while the system scales up\n- **Troubleshooting**: If deployment takes over 1 hour, this typically indicates a crash and should be investigated\n- **Best practice**: Monitor deployment status and contact support if deployment times are unusually long\n\n### 2. **Custom Model Deployment**\nFireworks AI supports custom base models through `firectl` - their deployment tool. You can deploy custom models using this command-line interface.\n\n### 3. **Deployment Tools**\n- **firectl**: The primary deployment tool for managing models on Fireworks AI\n- Used for both standard and custom model deployments\n- Supports configuration via YAML files\n\n### 4. **Monitoring and Management**\n- Monitor deployment status regularly\n- Contact support for unusually long deployment times\n- Watch for scaling delays when starting from zero instances\n\n### 5. **Configuration Management**\nDeployments can be configured using YAML configuration files, similar to how fine-tuning jobs are configured.\n\n## Next Steps for Managing Deployments\n\nTo get started with deployment management, you should:\n\n1. **Install firectl**: The Fireworks AI command-line tool\n2. **Prepare your model**: Ensure your model is properly formatted and ready for deployment\n3. **Create deployment configuration**: Use YAML files to define deployment parameters\n4. **Monitor deployment**: Use built-in monitoring tools to track deployment status\n5. **Scale as needed**: Configure auto-scaling based on your traffic patterns\n\nWould you like me to search for more specific information about any of these deployment management aspects, such as specific firectl commands or configuration examples?","tool_calls":[]}],"input_metadata":{"row_id":"feel-might-gaseous-picture"},"created_at":"2025-08-05T10:43:36.343980"} {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms and features.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment Fireworks AI platform features\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for specific deployment management concepts like scaling, monitoring, and configuration.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment scaling monitoring configuration\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more comprehensive deployment management information including deployment methods and best practices.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment methods best practices model serving\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for specific deployment commands and API endpoints.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI API deployment endpoints commands CLI\"}"}}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for deployment configuration and management features.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment configuration model settings\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management topics like autoscaling, load balancing, and deployment lifecycle.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI autoscaling load balancing deployment lifecycle management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the information I've gathered, let me provide you with a comprehensive guide on managing deployments on Fireworks AI:\n\n## Managing Deployments on Fireworks AI\n\n### 1. Deployment Performance Expectations\n\n**Initial Deployment:**\n- Should complete within minutes\n- Monitor deployment status actively\n\n**Scaling from Zero:**\n- May experience brief availability delays while the system scales up\n- This is normal behavior when scaling from zero instances\n\n**Troubleshooting:**\n- If deployment takes over 1 hour, this typically indicates a crash\n- Contact support if deployment times are unusually long\n\n### 2. Key Deployment Management Commands\n\nHere are the essential commands you'll need:\n\n```bash\n# Check deployment status\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/status\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Monitor scaling events\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/scaling\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Update deployment configuration\ncurl -X PATCH \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"min_instances\": 2,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7\n }'\n```\n\n### 3. Deployment Configuration Management\n\n**Basic Configuration:**\n```python\nimport fireworks.client\n\n# Configure deployment settings\ndeployment_config = {\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"deployment_name\": \"my-production-model\",\n \"min_instances\": 1,\n \"max_instances\": 5,\n \"scaling_threshold\": 0.8,\n \"timeout\": 30\n}\n\n# Create deployment\nresponse = fireworks.client.deployments.create(\n model=deployment_config[\"model\"],\n deployment_name=deployment_config[\"deployment_name\"],\n min_instances=deployment_config[\"min_instances\"],\n max_instances=deployment_config[\"max_instances\"]\n)\n```\n\n### 4. Monitoring and Observability\n\n**Set up monitoring:**\n```python\nimport requests\nimport time\n\ndef monitor_deployment_health(deployment_id):\n \"\"\"Monitor deployment health and scaling events\"\"\"\n url = f\"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/metrics\"\n headers = {\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n \n response = requests.get(url, headers=headers)\n metrics = response.json()\n \n return {\n \"cpu_utilization\": metrics.get(\"cpu_utilization\"),\n \"memory_usage\": metrics.get(\"memory_usage\"),\n \"active_instances\": metrics.get(\"active_instances\"),\n \"request_count\": metrics.get(\"request_count\"),\n \"error_rate\": metrics.get(\"error_rate\")\n }\n\n# Continuous monitoring loop\nwhile True:\n health = monitor_deployment_health(\"your-deployment-id\")\n print(f\"Active instances: {health['active_instances']}\")\n print(f\"CPU utilization: {health['cpu_utilization']}%\")\n time.sleep(60) # Check every minute\n```\n\n### 5. Autoscaling Configuration\n\n**Configure autoscaling parameters:**\n```json\n{\n \"autoscaling\": {\n \"min_instances\": 1,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7,\n \"scale_up_cooldown\": 60,\n \"scale_down_cooldown\": 300,\n \"metrics\": {\n \"cpu\": {\n \"target\": 70,\n \"type\": \"Utilization\"\n },\n \"memory\": {\n \"target\": 80,\n \"type\": \"Utilization\"\n }\n }\n }\n}\n```\n\n### 6. Deployment Lifecycle Management\n\n**Rolling updates:**\n```bash\n# Perform rolling update without downtime\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/update\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"strategy\": \"rolling\",\n \"max_unavailable\": 1,\n \"max_surge\": 1,\n \"new_config\": {\n \"image\": \"new-model-version:latest\",\n \"resources\": {\n \"cpu\": \"2\",\n \"memory\": \"4Gi\"\n }\n }\n }'\n```\n\n### 7. Best Practices for Deployment Management\n\n1. **Health Checks:**\n```python\ndef deployment_health_check(endpoint):\n \"\"\"Perform health check on deployment\"\"\"\n try:\n response = requests.get(\n f\"{endpoint}/health\",\n timeout=5,\n headers={\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n )\n return response.status_code == 200\n except:\n return False\n```\n\n2. **Resource Management:**\n```yaml\n# Recommended resource allocation\nresources:\n requests:\n cpu: 1000m\n memory: 2Gi\n limits:\n cpu: 2000m\n memory: 4Gi\n```\n\n3. **Monitoring Setup:**\n```python\n# Set up alerts for critical metrics\nalerts = {\n \"high_error_rate\": lambda x: x > 0.05,\n \"high_latency\": lambda x: x > 1000,\n \"low_availability\": lambda x: x < 0.99\n}\n```\n\n### 8. Deployment Rollback\n\n**Rollback to previous version:**\n```bash\n# Rollback deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/rollback\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"revision\": \"previous\",\n \"reason\": \"performance degradation\"\n }'\n```\n\n### 9. Cost Optimization\n\n**Set up cost monitoring:**\n```python\ndef calculate_deployment_cost(instance_type, hours_running):\n \"\"\"Calculate deployment costs\"\"\"\n pricing = {\n \"small\": 0.05, # per hour\n \"medium\": 0.10, # per hour\n \"large\": 0.20 # per hour\n }\n return pricing.get(instance_type, 0.10) * hours_running\n```\n\n### 10. Troubleshooting Common Issues\n\n**Deployment stuck:**\n```bash\n# Check deployment logs\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/logs\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Restart deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/restart\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\nThis comprehensive guide covers the key aspects of managing deployments on Fireworks AI. Start with basic monitoring and gradually implement more advanced features like autoscaling and rolling updates as your needs grow.","tool_calls":[]}],"input_metadata":{"row_id":"identify-be-unfriendly-girl"},"created_at":"2025-08-05T10:59:52.732744"} {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployments management create update delete scale\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"create deployment configuration scaling replicas\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Replica count (horizontal scaling)\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: The number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment management CLI commands create update list\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment configuration parameters GPU memory CPU firectl\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Which accelerator/GPU should I use?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/which-acceleratorgpu-should-i-use\nContent: It depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nWhich accelerator/GPU should I use?\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"list deployments get deployment status update deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl list deployments get deployment configuration examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"get deployment status check deployment health API endpoint\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: This endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment lifecycle states status monitoring health checks\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: Check Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment commands examples create list update delete\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management tutorial examples firectl commands\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, let me provide you with a comprehensive guide on managing deployments on Fireworks. I'll cover the key aspects including creation, configuration, scaling, monitoring, and deletion.\n\n## Managing Deployments on Fireworks: Complete Guide\n\n### 1. Prerequisites and Setup\n\nBefore managing deployments, ensure your account ID is properly configured to avoid \"invalid id\" errors:\n\n```bash\n# Configure your account ID\nexport FIREWORKS_ACCOUNT_ID=\"your-account-id\"\n```\n\n### 2. Creating Deployments\n\n#### Basic Deployment Creation\n```bash\n# Create a basic deployment\nfirectl create deployment \n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 5 \\\n --accelerator-type A100 \\\n --accelerator-count 1\n```\n\n#### Advanced Deployment Configuration\n```bash\n# Create deployment with comprehensive settings\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --display-name \"My Production Model\" \\\n --description \"High-performance deployment for production workloads\"\n```\n\n### 3. Deployment Scaling Configuration\n\n#### Horizontal Scaling (Replica Management)\n```bash\n# Auto-scaling configuration\nfirectl create deployment \\\n --min-replica-count 0 \\ # Scale to zero when unused\n --max-replica-count 10 \\ # Maximum replicas\n --autoscaling-policy.scale-up-window \"60s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"600s\"\n```\n\n#### Fixed Scaling\n```bash\n# Fixed number of replicas\nfirectl create deployment \\\n --min-replica-count 3 \\\n --max-replica-count 3 # Fixed at 3 replicas\n```\n\n### 4. GPU and Resource Configuration\n\n#### GPU Selection Guide\n- **A100**: Cost-effective for low-volume use cases\n- **H100**: Highest throughput for high-volume use cases\n- **H200**: Recommended for large models (DeepSeek V3/R1)\n- **MI300X**: Highest memory capacity, best for large models\n\n```bash\n# Different GPU configurations\nfirectl create deployment \\\n --accelerator-type A100 \\\n --accelerator-count 1\n\nfirectl create deployment \\\n --accelerator-type H100 \\\n --accelerator-count 8 # For large models like Llama 405B\n```\n\n### 5. Listing and Monitoring Deployments\n\n#### List All Deployments\n```bash\n# List all deployments in your account\nfirectl list deployments\n\n# Get specific deployment details\nfirectl get deployment \n```\n\n#### API-based Monitoring\n```bash\n# Check deployment status via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 6. Updating Deployments\n\n#### Update Configuration\n```bash\n# Update deployment via API\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 5,\n \"maxReplicaCount\": 10,\n \"displayName\": \"Updated Production Model\",\n \"description\": \"Increased capacity for higher load\"\n }'\n```\n\n#### Common Update Scenarios\n```bash\n# Scale up for increased demand\nfirectl update deployment \\\n --min-replica-count 5 \\\n --max-replica-count 15\n\n# Update display name and description\nfirectl update deployment \\\n --display-name \"Production Llama 3.1 70B\" \\\n --description \"Main production deployment for customer service\"\n```\n\n### 7. Deployment Lifecycle Management\n\n#### Deployment States\n- **STATE_UNSPECIFIED**: Initial state\n- **CREATING**: Deployment is being created\n- **RUNNING**: Deployment is active and serving requests\n- **UPDATING**: Configuration is being updated\n- **DELETING**: Deployment is being deleted\n- **ERROR**: Deployment encountered an error\n\n#### Health Monitoring\n```bash\n# Check deployment health\nfirectl get deployment --watch\n\n# Monitor via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" | jq '.status'\n```\n\n### 8. Deleting Deployments\n\n#### Soft Deletion (Default)\n```bash\n# Delete deployment (soft delete)\nfirectl delete deployment \n\n# API-based deletion\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n#### Hard Deletion\n```bash\n# Force deletion ignoring checks\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}?hard=true&ignoreChecks=true\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 9. Best Practices\n\n#### Cost Optimization\n```bash\n# Enable scale-to-zero for development environments\nfirectl create deployment \\\n --min-replica-count 0 \\\n --max-replica-count 2 \\\n --accelerator-type A100\n\n# Use reserved capacity for production\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --reserved-capacity true\n```\n\n#### Monitoring Setup\n```bash\n# Set up alerts for deployment health\n# Monitor key metrics:\n# - Replica count\n# - Request latency\n# - Error rates\n# - GPU utilization\n```\n\n### 10. Troubleshooting Common Issues\n\n#### Invalid ID Errors\n```bash\n# Fix account ID configuration\nexport FIREWORKS_ACCOUNT_ID=$(firectl get account | jq -r '.id')\necho \"Account ID: $FIREWORKS_ACCOUNT_ID\"\n```\n\n#### Scaling Issues\n```bash\n# Check for GPU stockouts\nfirectl get deployment --verbose\n\n# Verify resource availability\nfirectl list available-resources --region us-central1\n```\n\n### Complete Example: Production Deployment\n\n```bash\n#!/bin/bash\n# Production deployment script\n\nMODEL_NAME=\"llama-3.1-70b-instruct\"\nDEPLOYMENT_NAME=\"prod-llama-70b-$(date +%Y%m%d)\"\n\n# Create production deployment\nfirectl create deployment $MODEL_NAME \\\n --display-name $DEPLOYMENT_NAME \\\n --description \"Production Llama 3.1 70B for customer service\" \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --autoscaling-policy.scale-up-window \"30s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"1800s\"\n\n# Get deployment ID\nDEPLOYMENT_ID=$(firectl list deployments | grep $DEPLOYMENT_NAME | awk '{print $1}')\n\n# Monitor deployment status\necho \"Monitoring deployment: $DEPLOYMENT_ID\"\nfirectl get deployment $DEPLOYMENT_ID --watch\n```\n\nThis comprehensive guide covers all aspects of managing deployments on Fireworks, from basic creation to advanced scaling and monitoring strategies.","tool_calls":[]}],"input_metadata":{"row_id":"ask-calculate-final-president"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:02:19.141203"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management Fireworks AI\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for more specific deployment-related terms.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"model deployment Fireworks AI console\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI deployment dashboard management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment-related documentation.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI model serving deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try a different approach and search for API documentation or deployment guides.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI API deployment endpoints management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI function calling deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment and scaling information.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI scaling deployment production models\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the available information, let me provide you with a comprehensive guide on managing deployments on Fireworks AI. While the search results are limited, I can share the key aspects of deployment management based on the platform's capabilities.\n\n## Managing Deployments on Fireworks AI\n\n### 1. **Deployment Overview**\nFireworks AI provides a streamlined approach to deploying AI models with minimal configuration. The platform handles infrastructure management automatically, allowing you to focus on model performance and application logic.\n\n### 2. **Key Deployment Management Features**\n\n#### **Model Deployment Options**\n```python\n# Basic model deployment using Fireworks client\nimport fireworks.client\n\n# Set your API key\nfireworks.client.api_key = \"your-api-key\"\n\n# Deploy a model for inference\nresponse = fireworks.client.ChatCompletion.create(\n model=\"accounts/fireworks/models/llama-v2-70b-chat\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### **Deployment Configuration**\n```python\n# Advanced deployment with custom configurations\ndeployment_config = {\n \"model\": \"your-model-name\",\n \"max_tokens\": 4096,\n \"temperature\": 0.7,\n \"top_p\": 0.9,\n \"deployment_type\": \"dedicated\" # or \"shared\"\n}\n```\n\n### 3. **Deployment Management Commands**\n\n#### **Deploy a New Model**\n```bash\n# Using Fireworks CLI (if available)\nfireworks deploy create \\\n --model \"accounts/your-account/models/your-model\" \\\n --name \"production-deployment\" \\\n --config production-config.yaml\n```\n\n#### **Scale Deployments**\n```bash\n# Scale up deployment instances\nfireworks deployment scale \\\n --deployment-id \"dep_123456\" \\\n --replicas 5 \\\n --min-instances 2 \\\n --max-instances 10\n```\n\n#### **Update Deployment Configuration**\n```bash\n# Update existing deployment\nfireworks deployment update \\\n --deployment-id \"dep_123456\" \\\n --config updated-config.yaml \\\n --rolling-update true\n```\n\n### 4. **Monitoring and Management**\n\n#### **Check Deployment Status**\n```python\nimport requests\n\n# Check deployment health\nresponse = requests.get(\n \"https://api.fireworks.ai/v1/deployments/dep_123456/status\",\n headers={\"Authorization\": f\"Bearer {api_key}\"}\n)\nstatus = response.json()\nprint(f\"Deployment Status: {status['state']}\")\n```\n\n#### **Monitor Performance Metrics**\n```python\n# Get deployment metrics\nmetrics = fireworks.client.Deployment.metrics(\n deployment_id=\"dep_123456\",\n time_range=\"24h\",\n metrics=[\"latency\", \"throughput\", \"error_rate\"]\n)\n```\n\n### 5. **Deployment Lifecycle Management**\n\n#### **Blue-Green Deployments**\n```yaml\n# deployment-config.yaml\ndeployment_strategy:\n type: \"blue_green\"\n traffic_split:\n blue: 90\n green: 10\n health_check:\n enabled: true\n path: \"/health\"\n interval: 30s\n```\n\n#### **A/B Testing Deployments**\n```python\n# Configure A/B testing between model versions\nab_config = {\n \"deployment_a\": {\n \"model\": \"model-v1\",\n \"traffic_percentage\": 50\n },\n \"deployment_b\": {\n \"model\": \"model-v2\", \n \"traffic_percentage\": 50\n },\n \"evaluation_metrics\": [\"latency\", \"accuracy\", \"user_satisfaction\"]\n}\n```\n\n### 6. **Production Deployment Best Practices**\n\n#### **Environment Management**\n```bash\n# Set up different environments\nfireworks env create production\nfireworks env create staging\nfireworks env create development\n\n# Deploy to specific environment\nfireworks deploy --env production --model your-model\n```\n\n#### **Configuration Management**\n```yaml\n# production-config.yaml\ndeployment:\n environment: production\n region: us-east-1\n auto_scaling:\n enabled: true\n min_instances: 2\n max_instances: 20\n target_cpu_utilization: 70\n monitoring:\n enabled: true\n metrics_collection: detailed\n alerting:\n - metric: latency_p99\n threshold: 1000ms\n action: scale_up\n```\n\n### 7. **Rollback and Recovery**\n\n#### **Rollback Deployment**\n```bash\n# Rollback to previous version\nfireworks deployment rollback \\\n --deployment-id \"dep_123456\" \\\n --version \"v1.2.3\" \\\n --strategy immediate\n```\n\n#### **Disaster Recovery**\n```python\n# Automated failover configuration\nfailover_config = {\n \"primary_region\": \"us-east-1\",\n \"backup_regions\": [\"us-west-2\", \"eu-west-1\"],\n \"failover_trigger\": {\n \"error_rate_threshold\": 5,\n \"latency_threshold\": 2000,\n \"health_check_failures\": 3\n }\n}\n```\n\n### 8. **Cost Optimization**\n\n#### **Auto-scaling Policies**\n```yaml\nscaling_policies:\n - type: \"target_tracking\"\n target_value: 70\n scale_up_cooldown: 300\n scale_down_cooldown: 300\n - type: \"scheduled\"\n schedule: \"0 2 * * *\" # Scale down at 2 AM\n min_instances: 1\n max_instances: 3\n```\n\n### 9. **Security and Access Control**\n\n#### **Deployment Access Management**\n```bash\n# Set deployment permissions\nfireworks deployment permissions set \\\n --deployment-id \"dep_123456\" \\\n --team \"engineering\" \\\n --role \"read-only\"\n\n# API key management\nfireworks api-keys create \\\n --deployment-id \"dep_123456\" \\\n --permissions \"read,write\" \\\n --expiry \"30d\"\n```\n\n### 10. **Integration with CI/CD**\n\n#### **GitHub Actions Integration**\n```yaml\n# .github/workflows/deploy.yml\nname: Deploy to Fireworks\non:\n push:\n branches: [main]\njobs:\n deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - name: Deploy to Fireworks\n run: |\n fireworks deploy create \\\n --model ${{ github.sha }} \\\n --config production-config.yaml\n```\n\n### Next Steps\n\n1. **Start with a staging deployment** to test your configuration\n2. **Set up monitoring** before going to production\n3. **Implement proper alerting** for critical metrics\n4. **Use infrastructure as code** for consistent deployments\n5. **Regular testing** of rollback procedures\n\nWould you like me to dive deeper into any specific aspect of deployment management, such as scaling strategies, monitoring setup, or cost optimization techniques?","tool_calls":[]}],"input_metadata":{"row_id":"miss-strong-gentle-side"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:04:58.857123"} From 9b1e528cc538cc9bccfe185374c87b2712822e86 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 11:09:08 -0700 Subject: [PATCH 09/54] feedback -> reason --- tests/pytest/test_pytest_mcp_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pytest/test_pytest_mcp_config.py b/tests/pytest/test_pytest_mcp_config.py index bbbff73b..6446af9d 100644 --- a/tests/pytest/test_pytest_mcp_config.py +++ b/tests/pytest/test_pytest_mcp_config.py @@ -32,12 +32,12 @@ def test_pytest_mcp_config(row: EvaluationRow) -> EvaluationRow: if len(tool_calls) == 0: row.evaluation_result = EvaluateResult( score=0, - feedback="No tool calls made", + reason="No tool calls made", ) return row row.evaluation_result = EvaluateResult( score=1, - feedback="At least one tool call was made", + reason="At least one tool call was made", ) return row From c0c437bd9010c5282db1594e7b86ee955baa4703 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 11:15:07 -0700 Subject: [PATCH 10/54] add zod types for eval protocol --- vite-app/package.json | 3 +- vite-app/pnpm-lock.yaml | 8 + vite-app/src/types/README.md | 143 ++++++++++++++++++ vite-app/src/types/eval-protocol-utils.ts | 176 ++++++++++++++++++++++ 4 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 vite-app/src/types/README.md create mode 100644 vite-app/src/types/eval-protocol-utils.ts diff --git a/vite-app/package.json b/vite-app/package.json index 7107464a..7546904a 100644 --- a/vite-app/package.json +++ b/vite-app/package.json @@ -12,7 +12,8 @@ "dependencies": { "react": "^19.1.0", "react-dom": "^19.1.0", - "react-router-dom": "^7.7.1" + "react-router-dom": "^7.7.1", + "zod": "^4.0.14" }, "devDependencies": { "@eslint/js": "^9.30.1", diff --git a/vite-app/pnpm-lock.yaml b/vite-app/pnpm-lock.yaml index 77288dda..64cfb409 100644 --- a/vite-app/pnpm-lock.yaml +++ b/vite-app/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: react-router-dom: specifier: ^7.7.1 version: 7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + zod: + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@eslint/js': specifier: ^9.30.1 @@ -1346,6 +1349,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod@4.0.14: + resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + snapshots: '@ampproject/remapping@2.3.0': @@ -2500,3 +2506,5 @@ snapshots: yallist@5.0.0: {} yocto-queue@0.1.0: {} + + zod@4.0.14: {} diff --git a/vite-app/src/types/README.md b/vite-app/src/types/README.md new file mode 100644 index 00000000..b86b1ceb --- /dev/null +++ b/vite-app/src/types/README.md @@ -0,0 +1,143 @@ +# Evaluation Protocol Types + +This directory contains Zod schemas and TypeScript types that mirror the Pydantic models from the Python `eval_protocol/models.py` file. + +## Files + +- `eval-protocol.ts` - Main Zod schemas and TypeScript types +- `eval-protocol-utils.ts` - Utility functions for working with evaluation data +- `index.ts` - Re-exports for easier importing + +## Usage + +### Basic Import + +```typescript +import { EvaluationRow, Message, EvaluateResult } from '@/types'; +``` + +### Using Zod Schemas for Validation + +```typescript +import { EvaluationRowSchema, MessageSchema } from '@/types'; + +// Validate incoming data +const validateEvaluationRow = (data: unknown) => { + return EvaluationRowSchema.parse(data); +}; + +// Safe parsing with error handling +const safeParseMessage = (data: unknown) => { + const result = MessageSchema.safeParse(data); + if (!result.success) { + console.error('Validation failed:', result.error); + return null; + } + return result.data; +}; +``` + +### Using Utility Functions + +```typescript +import { evalRowUtils, messageUtils, evaluateResultUtils } from '@/types/eval-protocol-utils'; + +// Check if evaluation is trajectory-based +const isTrajectory = evalRowUtils.isTrajectoryEvaluation(evaluationRow); + +// Get conversation length +const length = evalRowUtils.getConversationLength(evaluationRow); + +// Get system message +const systemMsg = evalRowUtils.getSystemMessage(evaluationRow); + +// Check if message has tool calls +const hasTools = messageUtils.hasToolCalls(message); + +// Get message content as string +const content = messageUtils.getContentAsString(message); +``` + +## Key Types + +### Core Types + +- `EvaluationRow` - Main data structure for evaluation results +- `Message` - Chat message with role, content, and optional metadata +- `EvaluateResult` - Evaluation results with scores and metrics +- `MetricResult` - Individual metric results +- `StepOutput` - Per-step evaluation output for RL scenarios + +### Agent Evaluation Framework (V2) + +- `TaskDefinitionModel` - Task configuration for agent evaluation +- `ResourceServerConfig` - Server configuration for tasks +- `EvaluationCriteriaModel` - Criteria for evaluating task success + +### MCP Configuration + +- `MCPMultiClientConfiguration` - MCP server configuration +- `MCPConfigurationServerStdio` - Stdio-based MCP server +- `MCPConfigurationServerUrl` - URL-based MCP server + +## Validation Examples + +### Validating API Responses + +```typescript +import { EvaluationRowSchema } from '@/types'; + +async function fetchEvaluationData(): Promise { + const response = await fetch('/api/evaluation'); + const data = await response.json(); + + // Validate the response + return EvaluationRowSchema.parse(data); +} +``` + +### Creating New Evaluation Data + +```typescript +import { EvaluationRowSchema, MessageSchema } from '@/types'; + +const newMessage: Message = { + role: 'user', + content: 'Hello, how are you?' +}; + +// Validate the message +const validatedMessage = MessageSchema.parse(newMessage); + +const newEvaluationRow = { + messages: [validatedMessage], + input_metadata: { + row_id: 'unique-id-123' + }, + created_at: new Date() +}; + +// Validate the evaluation row +const validatedRow = EvaluationRowSchema.parse(newEvaluationRow); +``` + +## Type Safety + +All types are derived from Zod schemas, ensuring runtime validation and compile-time type safety. The schemas include: + +- Field validation (e.g., score ranges, required fields) +- Default values +- Optional fields +- Union types for flexible content +- Descriptive error messages + +## Migration from Python + +The TypeScript types closely mirror the Python Pydantic models: + +- `BaseModel` → `z.object()` +- `Field()` → `z.string().describe()` +- `Optional[T]` → `z.optional()` +- `List[T]` → `z.array()` +- `Dict[str, Any]` → `z.record(z.any())` +- `extra="allow"` → `.passthrough()` \ No newline at end of file diff --git a/vite-app/src/types/eval-protocol-utils.ts b/vite-app/src/types/eval-protocol-utils.ts new file mode 100644 index 00000000..67d66056 --- /dev/null +++ b/vite-app/src/types/eval-protocol-utils.ts @@ -0,0 +1,176 @@ +import { EvaluationRow, Message } from './eval-protocol'; + +/** + * Utility functions for working with EvaluationRow data + * These mirror the methods from the Python EvaluationRow class + */ + +export const evalRowUtils = { + /** + * Returns True if this represents a trajectory evaluation (has step_outputs), + * False if it represents a single turn evaluation. + */ + isTrajectoryEvaluation: (row: EvaluationRow): boolean => { + return ( + row.evaluation_result !== undefined && + row.evaluation_result.step_outputs !== undefined && + row.evaluation_result.step_outputs.length > 0 + ); + }, + + /** + * Returns the number of messages in the conversation. + */ + getConversationLength: (row: EvaluationRow): number => { + return row.messages.length; + }, + + /** + * Returns the system message from the conversation. Returns empty Message if none found. + */ + getSystemMessage: (row: EvaluationRow): Message => { + const systemMessages = row.messages.filter(msg => msg.role === 'system'); + if (systemMessages.length === 0) { + return { role: 'system', content: '' }; + } + return systemMessages[0]; + }, + + /** + * Returns only the assistant messages from the conversation. + */ + getAssistantMessages: (row: EvaluationRow): Message[] => { + return row.messages.filter(msg => msg.role === 'assistant'); + }, + + /** + * Returns only the user messages from the conversation. + */ + getUserMessages: (row: EvaluationRow): Message[] => { + return row.messages.filter(msg => msg.role === 'user'); + }, + + /** + * Helper method to get a specific value from input_metadata. + */ + getInputMetadata: (row: EvaluationRow, key: string, defaultValue?: any): any => { + if (!row.input_metadata) { + return defaultValue; + } + return (row.input_metadata as any)[key] ?? defaultValue; + }, + + /** + * Get number of steps from control_plane_step data. + */ + getSteps: (row: EvaluationRow): number => { + return row.messages.filter(msg => msg.control_plane_step).length; + }, + + /** + * Get total reward from control_plane_step data. + */ + getTotalReward: (row: EvaluationRow): number => { + const messagesWithControlPlane = row.messages.filter(msg => msg.control_plane_step); + if (messagesWithControlPlane.length === 0) { + return 0.0; + } + return messagesWithControlPlane.reduce((total, msg) => { + const reward = (msg.control_plane_step as any)?.reward; + return total + (typeof reward === 'number' ? reward : 0); + }, 0.0); + }, + + /** + * Get termination status from control_plane_step data. + */ + getTerminated: (row: EvaluationRow): boolean => { + const messagesWithControlPlane = row.messages.filter(msg => msg.control_plane_step); + if (messagesWithControlPlane.length === 0) { + return false; + } + return messagesWithControlPlane.some(msg => { + return (msg.control_plane_step as any)?.terminated === true; + }); + }, + + /** + * Get termination reason from the final control_plane_step data. + */ + getTerminationReason: (row: EvaluationRow): string => { + // Find the last message with control_plane_step that has termination_reason + for (let i = row.messages.length - 1; i >= 0; i--) { + const msg = row.messages[i]; + if (msg.control_plane_step && (msg.control_plane_step as any)?.termination_reason) { + return (msg.control_plane_step as any).termination_reason; + } + } + return 'unknown'; + } +}; + +/** + * Utility functions for working with Message data + */ +export const messageUtils = { + /** + * Check if a message has tool calls + */ + hasToolCalls: (message: Message): boolean => { + return message.tool_calls !== undefined && message.tool_calls.length > 0; + }, + + /** + * Check if a message has function calls + */ + hasFunctionCall: (message: Message): boolean => { + return message.function_call !== undefined; + }, + + /** + * Get the content as a string, handling both string and array content types + */ + getContentAsString: (message: Message): string => { + if (typeof message.content === 'string') { + return message.content; + } + if (Array.isArray(message.content)) { + return message.content + .filter(part => part.type === 'text') + .map(part => part.text) + .join(''); + } + return ''; + } +}; + +/** + * Utility functions for working with EvaluateResult data + */ +export const evaluateResultUtils = { + /** + * Check if the evaluation result has step outputs (trajectory evaluation) + */ + hasStepOutputs: (result: any): boolean => { + return result.step_outputs !== undefined && result.step_outputs.length > 0; + }, + + /** + * Get the total base reward from step outputs + */ + getTotalBaseReward: (result: any): number => { + if (!result.step_outputs) { + return 0.0; + } + return result.step_outputs.reduce((total: number, step: any) => { + return total + (step.base_reward || 0); + }, 0.0); + }, + + /** + * Get the number of steps from step outputs + */ + getStepCount: (result: any): number => { + return result.step_outputs?.length || 0; + } +}; \ No newline at end of file From 742f5221f65aa289d19816410cc0ed06d2676c3c Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 11:31:57 -0700 Subject: [PATCH 11/54] save. fix reloading --- eval_protocol/utils/logs_server.py | 42 ++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py index 0780ab5e..562c3d25 100644 --- a/eval_protocol/utils/logs_server.py +++ b/eval_protocol/utils/logs_server.py @@ -3,17 +3,17 @@ import logging import os import time -from pathlib import Path -from typing import Dict, List, Optional, Set +from typing import List, Optional from watchdog.events import FileSystemEventHandler, FileSystemEvent from watchdog.observers import Observer import uvicorn -from fastapi import FastAPI, WebSocket, WebSocketDisconnect -from fastapi.staticfiles import StaticFiles -from fastapi.responses import FileResponse +from fastapi import WebSocket, WebSocketDisconnect -from .vite_server import ViteServer +from eval_protocol.dataset_logger import default_logger +from eval_protocol.utils.vite_server import ViteServer + +default_logger logger = logging.getLogger(__name__) @@ -22,7 +22,7 @@ class FileWatcher(FileSystemEventHandler): """File system watcher that tracks file changes.""" def __init__(self, websocket_manager): - self.websocket_manager = websocket_manager + self.websocket_manager: WebSocketManager = websocket_manager self.ignored_patterns = { ".git", "__pycache__", @@ -83,7 +83,21 @@ def disconnect(self, websocket: WebSocket): def broadcast_file_update(self, update_type: str, file_path: str): """Broadcast file update to all connected clients.""" + if not file_path.startswith(default_logger.datasets_dir): + return + message = {"type": update_type, "path": file_path, "timestamp": time.time()} + # Include file contents for created and modified events + if update_type in ["file_created", "file_changed"] and os.path.exists(file_path): + try: + with open(file_path, "r", encoding="utf-8") as f: + message["contents"] = f.read() + except Exception as e: + logger.warning(f"Failed to read file contents for {file_path}: {e}") + message["contents"] = None + elif update_type == "file_deleted": + message["contents"] = None + json_message = json.dumps(message) # Broadcast to all active connections @@ -194,9 +208,17 @@ async def run_async(self, reload: bool = False): # Store the event loop for WebSocket manager self.websocket_manager._loop = asyncio.get_running_loop() - config = uvicorn.Config(self.app, host=self.host, port=self.port, reload=reload, log_level="info") + config = uvicorn.Config( + self.app, + host=self.host, + port=self.port, + reload=reload, + reload_dirs=self.watch_paths, + log_level="info", + ) server = uvicorn.Server(config) await server.serve() + except KeyboardInterrupt: logger.info("Shutting down LogsServer...") finally: @@ -231,3 +253,7 @@ def serve_logs( """ server = LogsServer(host=host, port=port, watch_paths=watch_paths) server.run(reload=reload) + + +if __name__ == "__main__": + serve_logs(reload=True) From 265016ab44600f578764237dde7f25c71d606159 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 12:36:06 -0700 Subject: [PATCH 12/54] Update FastAPI dependency to version 0.116.1 and refactor LogsServer to use async context manager for file watching lifecycle. Enhance WebSocket connection handling in the frontend with exponential backoff for reconnection attempts. --- eval_protocol/utils/logs_server.py | 59 +++-- eval_protocol/utils/vite_server.py | 11 +- pyproject.toml | 3 +- uv.lock | 376 ++++++++++++++++++++++++++++- vite-app/src/App.tsx | 62 ++++- 5 files changed, 478 insertions(+), 33 deletions(-) diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py index 562c3d25..2c586055 100644 --- a/eval_protocol/utils/logs_server.py +++ b/eval_protocol/utils/logs_server.py @@ -1,4 +1,5 @@ import asyncio +from contextlib import asynccontextmanager import json import logging import os @@ -8,7 +9,7 @@ from watchdog.observers import Observer import uvicorn -from fastapi import WebSocket, WebSocketDisconnect +from fastapi import FastAPI, WebSocket, WebSocketDisconnect from eval_protocol.dataset_logger import default_logger from eval_protocol.utils.vite_server import ViteServer @@ -85,6 +86,7 @@ def broadcast_file_update(self, update_type: str, file_path: str): """Broadcast file update to all connected clients.""" if not file_path.startswith(default_logger.datasets_dir): return + logger.info(f"Broadcasting file update: {update_type} {file_path}") message = {"type": update_type, "path": file_path, "timestamp": time.time()} # Include file contents for created and modified events @@ -126,12 +128,10 @@ def __init__( os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "vite-app", "dist") ), host: str = "localhost", - port: int = 4789, + port: Optional[int] = None, index_file: str = "index.html", watch_paths: Optional[List[str]] = None, ): - super().__init__(build_dir, host, port, index_file) - # Initialize WebSocket manager self.websocket_manager = WebSocketManager() @@ -139,6 +139,18 @@ def __init__( self.watch_paths = watch_paths or [os.getcwd()] self.observer = Observer() self.file_watcher = FileWatcher(self.websocket_manager) + self._file_watching_started = False + + @asynccontextmanager + async def lifespan(app: FastAPI): + print("before") + self.start_file_watching() + self.websocket_manager._loop = asyncio.get_running_loop() + yield + print("after") + self.stop_file_watching() + + super().__init__(build_dir, host, port, index_file, lifespan=lifespan) # Add WebSocket endpoint self._setup_websocket_routes() @@ -174,6 +186,11 @@ async def status(): def start_file_watching(self): """Start watching file system for changes.""" + # Check if file watching has already been started + if self._file_watching_started: + logger.info("File watching already started, skipping") + return + for path in self.watch_paths: if os.path.exists(path): self.observer.schedule(self.file_watcher, path, recursive=True) @@ -182,15 +199,18 @@ def start_file_watching(self): logger.warning(f"Watch path does not exist: {path}") self.observer.start() + self._file_watching_started = True logger.info("File watching started") def stop_file_watching(self): """Stop watching file system.""" - self.observer.stop() - self.observer.join() - logger.info("File watching stopped") + if self._file_watching_started: + self.observer.stop() + self.observer.join() + self._file_watching_started = False + logger.info("File watching stopped") - async def run_async(self, reload: bool = False): + async def run_async(self): """ Run the logs server asynchronously with file watching. @@ -212,10 +232,9 @@ async def run_async(self, reload: bool = False): self.app, host=self.host, port=self.port, - reload=reload, - reload_dirs=self.watch_paths, log_level="info", ) + server = uvicorn.Server(config) await server.serve() @@ -224,22 +243,21 @@ async def run_async(self, reload: bool = False): finally: self.stop_file_watching() - def run(self, reload: bool = False): + def run(self): """ Run the logs server with file watching. Args: reload: Whether to enable auto-reload (default: False) """ - asyncio.run(self.run_async(reload)) + asyncio.run(self.run_async()) + + +server = LogsServer() +app = server.app -def serve_logs( - host: str = "localhost", - port: int = 4789, - watch_paths: Optional[List[str]] = None, - reload: bool = False, -): +def serve_logs(): """ Convenience function to create and run a LogsServer. @@ -251,9 +269,8 @@ def serve_logs( watch_paths: List of paths to watch for file changes reload: Whether to enable auto-reload """ - server = LogsServer(host=host, port=port, watch_paths=watch_paths) - server.run(reload=reload) + server.run() if __name__ == "__main__": - serve_logs(reload=True) + serve_logs() diff --git a/eval_protocol/utils/vite_server.py b/eval_protocol/utils/vite_server.py index 08a60097..f5875ad4 100644 --- a/eval_protocol/utils/vite_server.py +++ b/eval_protocol/utils/vite_server.py @@ -1,7 +1,7 @@ import os import logging from pathlib import Path -from typing import Optional +from typing import AsyncGenerator, Callable, Optional import uvicorn from fastapi import FastAPI, HTTPException @@ -27,13 +27,18 @@ class ViteServer: """ def __init__( - self, build_dir: str = "dist", host: str = "localhost", port: int = 8000, index_file: str = "index.html" + self, + build_dir: str = "dist", + host: str = "localhost", + port: int = 8000, + index_file: str = "index.html", + lifespan: Optional[Callable[[FastAPI], AsyncGenerator[None, None]]] = None, ): self.build_dir = Path(build_dir) self.host = host self.port = port self.index_file = index_file - self.app = FastAPI(title="Vite SPA Server") + self.app = FastAPI(title="Vite SPA Server", lifespan=lifespan) # Validate build directory exists if not self.build_dir.exists(): diff --git a/pyproject.toml b/pyproject.toml index 89e852c9..02cc45b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,6 @@ dependencies = [ "requests>=2.25.0", "pydantic>=2.0.0", "dataclasses-json>=0.5.7", - "fastapi>=0.68.0", "uvicorn>=0.15.0", "python-dotenv>=0.19.0", "openai==1.78.1", @@ -50,6 +49,7 @@ dependencies = [ "watchdog>=2.1.0", "websockets>=15.0.1", "fireworks-ai>=0.19.12", + "fastapi>=0.116.1", ] [project.urls] @@ -143,6 +143,7 @@ tau2 = { git = "https://github.com/sierra-research/tau2-bench.git" } [dependency-groups] dev = [ + "fastapi[standard]>=0.116.1", "fastmcp>=2.10.6", "haikus==0.3.8", "pytest>=8.4.1", diff --git a/uv.lock b/uv.lock index a6ce863c..d24abc24 100644 --- a/uv.lock +++ b/uv.lock @@ -1218,6 +1218,7 @@ trl = [ [package.dev-dependencies] dev = [ + { name = "fastapi", extra = ["standard"] }, { name = "fastmcp" }, { name = "haikus" }, { name = "pytest" }, @@ -1241,7 +1242,7 @@ requires-dist = [ { name = "docker", marker = "extra == 'dev'", specifier = "==7.1.0" }, { name = "docstring-parser", specifier = ">=0.15" }, { name = "e2b", marker = "extra == 'dev'" }, - { name = "fastapi", specifier = ">=0.68.0" }, + { name = "fastapi", specifier = ">=0.116.1" }, { name = "fireworks-ai", specifier = ">=0.19.12" }, { name = "fireworks-ai", marker = "extra == 'fireworks'", specifier = ">=0.19.10" }, { name = "flake8", marker = "extra == 'dev'", specifier = ">=3.9.2" }, @@ -1305,6 +1306,7 @@ provides-extras = ["dev", "trl", "openevals", "fireworks", "box2d", "langfuse", [package.metadata.requires-dev] dev = [ + { name = "fastapi", extras = ["standard"], specifier = ">=0.116.1" }, { name = "fastmcp", specifier = ">=2.10.6" }, { name = "haikus", specifier = "==0.3.8" }, { name = "pytest", specifier = ">=8.4.1" }, @@ -1363,6 +1365,54 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" }, ] +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/94/3ef75d9c7c32936ecb539b9750ccbdc3d2568efd73b1cb913278375f4533/fastapi_cli-0.0.8.tar.gz", hash = "sha256:2360f2989b1ab4a3d7fc8b3a0b20e8288680d8af2e31de7c38309934d7f8a0ee", size = 16884, upload-time = "2025-07-07T14:44:09.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/3f/6ad3103c5f59208baf4c798526daea6a74085bb35d1c161c501863470476/fastapi_cli-0.0.8-py3-none-any.whl", hash = "sha256:0ea95d882c85b9219a75a65ab27e8da17dac02873e456850fa0a726e96e985eb", size = 10770, upload-time = "2025-07-07T14:44:08.255Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "fastapi-cloud-cli" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cloud-cli" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "pydantic", extra = ["email"] }, + { name = "rich-toolkit" }, + { name = "rignore" }, + { name = "sentry-sdk" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/2e/3b6e5016affc310e5109bc580f760586eabecea0c8a7ab067611cd849ac0/fastapi_cloud_cli-0.1.5.tar.gz", hash = "sha256:341ee585eb731a6d3c3656cb91ad38e5f39809bf1a16d41de1333e38635a7937", size = 22710, upload-time = "2025-07-28T13:30:48.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/a6/5aa862489a2918a096166fd98d9fe86b7fd53c607678b3fa9d8c432d88d5/fastapi_cloud_cli-0.1.5-py3-none-any.whl", hash = "sha256:d80525fb9c0e8af122370891f9fa83cf5d496e4ad47a8dd26c0496a6c85a012a", size = 18992, upload-time = "2025-07-28T13:30:47.427Z" }, +] + [[package]] name = "fastjsonschema" version = "2.21.1" @@ -1778,6 +1828,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/6f/972f8eb0ea7d98a1c6be436e2142d51ad2a64ee18e02b0e7ff1f62171ab1/httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0", size = 198780, upload-time = "2024-10-16T19:44:06.882Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/17c672b4bc5c7ba7f201eada4e96c71d0a59fbc185e60e42580093a86f21/httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da", size = 103297, upload-time = "2024-10-16T19:44:08.129Z" }, + { url = "https://files.pythonhosted.org/packages/92/5e/b4a826fe91971a0b68e8c2bd4e7db3e7519882f5a8ccdb1194be2b3ab98f/httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1", size = 443130, upload-time = "2024-10-16T19:44:09.45Z" }, + { url = "https://files.pythonhosted.org/packages/b0/51/ce61e531e40289a681a463e1258fa1e05e0be54540e40d91d065a264cd8f/httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50", size = 442148, upload-time = "2024-10-16T19:44:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/270b7d767849b0c96f275c695d27ca76c30671f8eb8cc1bab6ced5c5e1d0/httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959", size = 415949, upload-time = "2024-10-16T19:44:13.388Z" }, + { url = "https://files.pythonhosted.org/packages/81/86/ced96e3179c48c6f656354e106934e65c8963d48b69be78f355797f0e1b3/httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4", size = 417591, upload-time = "2024-10-16T19:44:15.258Z" }, + { url = "https://files.pythonhosted.org/packages/75/73/187a3f620ed3175364ddb56847d7a608a6fc42d551e133197098c0143eca/httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c", size = 88344, upload-time = "2024-10-16T19:44:16.54Z" }, + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload-time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload-time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload-time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload-time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload-time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload-time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload-time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload-time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload-time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload-time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload-time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload-time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload-time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload-time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" }, +] + [[package]] name = "httpx" version = "0.28.1" @@ -4967,6 +5053,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/bc/cc4e3dbc5e7992398dcb7a8eda0cbcf4fb792a0cdb93f857b478bf3cf884/rich_rst-1.3.1-py3-none-any.whl", hash = "sha256:498a74e3896507ab04492d326e794c3ef76e7cda078703aa592d1853d91098c1", size = 11621, upload-time = "2024-04-30T04:40:32.619Z" }, ] +[[package]] +name = "rich-toolkit" +version = "0.14.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/4f/ec4addb95da2abe9e988c206436193d3b4e678f3113b40dfd61628a2d7e6/rich_toolkit-0.14.9.tar.gz", hash = "sha256:090b6c3f87261bc1ca4fe7fc9b0d3625b5af917ccdbcd316a26719e5d3ab20b9", size = 111025, upload-time = "2025-07-28T13:25:39.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/13/39030884b963a602041e4c0c90bd1a58b068f8ec9d33baddd62216eee56c/rich_toolkit-0.14.9-py3-none-any.whl", hash = "sha256:e2404f1f088286f2f9d7f3a1a7591c8057792db466f6fecabfae283fa64126e2", size = 25018, upload-time = "2025-07-28T13:25:38.542Z" }, +] + +[[package]] +name = "rignore" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/46/05a94dc55ac03cf931d18e43b86ecee5ee054cb88b7853fffd741e35009c/rignore-0.6.4.tar.gz", hash = "sha256:e893fdd2d7fdcfa9407d0b7600ef2c2e2df97f55e1c45d4a8f54364829ddb0ab", size = 11633, upload-time = "2025-07-19T19:24:46.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/27/55ec2871e42c0a01669f7741598a5948f04bd32f3975478a0bead9e7e251/rignore-0.6.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c201375cfe76e56e61fcdfe50d0882aafb49544b424bfc828e0508dc9fbc431b", size = 888088, upload-time = "2025-07-19T19:23:50.776Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/6be3d7adf91f7d67f08833a29dea4f7c345554b385f9a797c397f6685f29/rignore-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4962d537e377394292c4828e1e9c620618dd8daa49ba746abe533733a89f8644", size = 824159, upload-time = "2025-07-19T19:23:44.395Z" }, + { url = "https://files.pythonhosted.org/packages/99/b7/fbb56b8cfa27971f9a19e87769dae0cb648343226eddda94ded32be2afc3/rignore-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a6dd2f213cff6ca3c4d257fa3f5b0c7d4f6c23fe83bf292425fbe8d0c9c908a", size = 892493, upload-time = "2025-07-19T19:22:32.061Z" }, + { url = "https://files.pythonhosted.org/packages/d5/cf/21f130801c29c1fcf22f00a41d7530cef576819ee1a26c86bdb7bb06a0f2/rignore-0.6.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:64d379193f86a21fc93762783f36651927f54d5eea54c4922fdccb5e37076ed2", size = 872810, upload-time = "2025-07-19T19:22:45.554Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4a/474a627263ef13a0ac28a0ce3a20932fbe41f6043f7280da47c7aca1f586/rignore-0.6.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53c4f8682cf645b7a9160e0f1786af3201ed54a020bb4abd515c970043387127", size = 1160488, upload-time = "2025-07-19T19:22:58.359Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c7/a10c180f77cbb456ab483c28e52efd6166cee787f11d21cb1d369b89e961/rignore-0.6.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af1246e672bd835a17d3ae91579b3c235ec55b10924ef22608d3e9ec90fa2699", size = 938780, upload-time = "2025-07-19T19:23:10.604Z" }, + { url = "https://files.pythonhosted.org/packages/32/68/8e67701e8cc9f157f12b3742e14f14e395c7f3a497720c7f6aab7e5cdec4/rignore-0.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eed48fbc3097af418862e3c5c26fa81aa993e0d8b5f3a0a9a29cc6975eedff", size = 950347, upload-time = "2025-07-19T19:23:33.759Z" }, + { url = "https://files.pythonhosted.org/packages/1e/11/8eef123a2d029ed697b119806a0ca8a99d9457500c40b4d26cd21860eb89/rignore-0.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df1215a071d42fd857fb6363c13803fbd915d48eaeaa9b103fb2266ba89c8995", size = 976679, upload-time = "2025-07-19T19:23:23.813Z" }, + { url = "https://files.pythonhosted.org/packages/09/7e/9584f4e4b3c1587ae09f286a14dab2376895d782be632289d151cb952432/rignore-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82f2d318e66756066ed664015d8ca720078ab1d319377f1f61e3f4d01325faea", size = 1067469, upload-time = "2025-07-19T19:23:57.616Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2c/d3515693b89c47761822219bb519cefd0cd45a38ff82c35a4ccdd8e95deb/rignore-0.6.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e7d4258fc81051097c4d4c6ad17f0100c40088dbd2c6c31fc3c888a1d5a16190", size = 1136199, upload-time = "2025-07-19T19:24:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/e7/39/94ea41846547ebb87d16527a3e978c8918632a060f77669a492f8a90b8b9/rignore-0.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a0d0b9ec7929df8fd35ae89cb56619850dc140869139d61a2f4fa2941d2d1878", size = 1111179, upload-time = "2025-07-19T19:24:21.908Z" }, + { url = "https://files.pythonhosted.org/packages/ce/77/9acda68c7cea4d5dd027ef63163e0be30008f635acd75ea801e4c443fcdd/rignore-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8883d079b948ffcd56b67572831c9b8949eca7fe2e8f7bdbf7691c7a9388f054", size = 1121143, upload-time = "2025-07-19T19:24:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/05/67/d1489e9224f33b9a87b7f870650bcab582ee3452df286bcb2fbb6a7ba257/rignore-0.6.4-cp310-cp310-win32.whl", hash = "sha256:5aeac5b354e15eb9f7857b02ad2af12ae2c2ed25a61921b0bd7e272774530f77", size = 643131, upload-time = "2025-07-19T19:24:54.437Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d1/7d668bed51d3f0895e875e57c8e42f421635cdbcb96652ab24f297c9c5cf/rignore-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:90419f881d05a1febb0578a175aa3e51d149ded1875421ed75a8af4392b7fe56", size = 721109, upload-time = "2025-07-19T19:24:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/be/11/66992d271dbc44eac33f3b6b871855bc17e511b9279a2a0982b44c2b0c01/rignore-0.6.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:85f684dfc2c497e35ad34ffd6744a3bcdcac273ec1dbe7d0464bfa20f3331434", size = 888239, upload-time = "2025-07-19T19:23:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1b/a9bde714e474043f97a06097925cf11e4597f9453adc267427d05ff9f38e/rignore-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23954acc6debc852dbccbffbb70f0e26b12d230239e1ad0638eb5540694d0308", size = 824348, upload-time = "2025-07-19T19:23:45.54Z" }, + { url = "https://files.pythonhosted.org/packages/db/58/dabba227fee6553f9be069f58128419b6d4954c784c4cd566cfe59955c1f/rignore-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2bf793bd58dbf3dee063a758b23ea446b5f037370405ecefc78e1e8923fc658", size = 892419, upload-time = "2025-07-19T19:22:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fa/e3c16368ee32d6d1146cf219b127fd5c7e6baf22cad7a7a5967782ff3b20/rignore-0.6.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1eaeaa5a904e098604ea2012383a721de06211c8b4013abf0d41c3cfeb982f4f", size = 873285, upload-time = "2025-07-19T19:22:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/78/9d/ef43d760dc3d18011d8482692b478785a846bba64157844b3068e428739c/rignore-0.6.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a48bdbeb03093e3fac2b40d62a718c59b5bb4f29cfdc8e7cbb360e1ea7bf0056", size = 1160457, upload-time = "2025-07-19T19:22:59.457Z" }, + { url = "https://files.pythonhosted.org/packages/95/de/eca1b035705e0b4e6c630fd1fcec45d14cf354a4acea88cf29ea0a322fea/rignore-0.6.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c5f9452d116be405f0967160b449c46ac929b50eaf527f33ee4680e3716e39", size = 938833, upload-time = "2025-07-19T19:23:11.657Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2d/58912efa4137e989616d679a5390b53e93d5150be47217dd686ff60cd4cd/rignore-0.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cf1039bfbdaa0f9710a6fb75436c25ca26d364881ec4d1e66d466bb36a7fb98", size = 950603, upload-time = "2025-07-19T19:23:35.245Z" }, + { url = "https://files.pythonhosted.org/packages/6f/3d/9827cc1c7674d8d884d3d231a224a2db8ea8eae075a1611dfdcd0c301e20/rignore-0.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:136629eb0ec2b6ac6ab34e71ce8065a07106fe615a53eceefc30200d528a4612", size = 976867, upload-time = "2025-07-19T19:23:24.919Z" }, + { url = "https://files.pythonhosted.org/packages/75/47/9dcee35e24897b62d66f7578f127bc91465c942a9d702d516d3fe7dcaa00/rignore-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:35e3d0ebaf01086e6454c3fecae141e2db74a5ddf4a97c72c69428baeff0b7d4", size = 1067603, upload-time = "2025-07-19T19:23:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/4b/68/f66e7c0b0fc009f3e19ba8e6c3078a227285e3aecd9f6498d39df808cdfd/rignore-0.6.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ed1f9010fa1ef5ea0b69803d1dfb4b7355921779e03a30396034c52691658bc", size = 1136289, upload-time = "2025-07-19T19:24:11.136Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/6fff161fe3ae5c0e0a0dded9a428e41d31c7fefc4e57c7553b9ffb064139/rignore-0.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c16e9e898ed0afe2e20fa8d6412e02bd13f039f7e0d964a289368efd4d9ad320", size = 1111566, upload-time = "2025-07-19T19:24:23.065Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c5/a5978ad65074a08dad46233a3333d154ae9cb9339325f3c181002a174746/rignore-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e6bc0bdcd404a7a8268629e8e99967127bb41e02d9eb09a471364c4bc25e215", size = 1121142, upload-time = "2025-07-19T19:24:35.151Z" }, + { url = "https://files.pythonhosted.org/packages/e8/af/91f084374b95dc2477a4bd066957beb3b61b551f2364b4f7f5bc52c9e4c7/rignore-0.6.4-cp311-cp311-win32.whl", hash = "sha256:fdd59bd63d2a49cc6d4f3598f285552ccb1a41e001df1012e0e0345cf2cabf79", size = 643031, upload-time = "2025-07-19T19:24:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/31672aa957aebba8903005313697127bbbad9db3afcfc9857150301fab1d/rignore-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:7bf5be0e8a01845e57b5faa47ef9c623bb2070aa2f743c2fc73321ffaae45701", size = 721003, upload-time = "2025-07-19T19:24:48.867Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6c/e5af4383cdd7829ef9aa63ac82a6507983e02dbc7c2e7b9aa64b7b8e2c7a/rignore-0.6.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:74720d074b79f32449d5d212ce732e0144a294a184246d1f1e7bcc1fc5c83b69", size = 885885, upload-time = "2025-07-19T19:23:53.236Z" }, + { url = "https://files.pythonhosted.org/packages/89/3e/1b02a868830e464769aa417ee195ac352fe71ff818df8ce50c4b998edb9c/rignore-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a8184fcf567bd6b6d7b85a0c138d98dd40f63054141c96b175844414c5530d7", size = 819736, upload-time = "2025-07-19T19:23:46.565Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/b9be0c523d97c09f3c6508a67ce376aba4efe41c333c58903a0d7366439a/rignore-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcb0d7d7ecc3fbccf6477bb187c04a091579ea139f15f139abe0b3b48bdfef69", size = 892779, upload-time = "2025-07-19T19:22:35.167Z" }, + { url = "https://files.pythonhosted.org/packages/91/f4/3064b06233697f2993485d132f06fe95061fef71631485da75aed246c4fd/rignore-0.6.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feac73377a156fb77b3df626c76f7e5893d9b4e9e886ac8c0f9d44f1206a2a91", size = 872116, upload-time = "2025-07-19T19:22:47.828Z" }, + { url = "https://files.pythonhosted.org/packages/99/94/cb8e7af9a3c0a665f10e2366144e0ebc66167cf846aca5f1ac31b3661598/rignore-0.6.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:465179bc30beb1f7a3439e428739a2b5777ed26660712b8c4e351b15a7c04483", size = 1163345, upload-time = "2025-07-19T19:23:00.557Z" }, + { url = "https://files.pythonhosted.org/packages/86/6b/49faa7ad85ceb6ccef265df40091d9992232d7f6055fa664fe0a8b13781c/rignore-0.6.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a4877b4dca9cf31a4d09845b300c677c86267657540d0b4d3e6d0ce3110e6e9", size = 939967, upload-time = "2025-07-19T19:23:13.494Z" }, + { url = "https://files.pythonhosted.org/packages/80/c8/b91afda10bd5ca1e3a80463340b899c0dc26a7750a9f3c94f668585c7f40/rignore-0.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:456456802b1e77d1e2d149320ee32505b8183e309e228129950b807d204ddd17", size = 949717, upload-time = "2025-07-19T19:23:36.404Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f1/88bfdde58ae3fb1c1a92bb801f492eea8eafcdaf05ab9b75130023a4670b/rignore-0.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c1ff2fc223f1d9473d36923160af37bf765548578eb9d47a2f52e90da8ae408", size = 975534, upload-time = "2025-07-19T19:23:25.988Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8f/a80b4a2e48ceba56ba19e096d41263d844757e10aa36ede212571b5d8117/rignore-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e445fbc214ae18e0e644a78086ea5d0f579e210229a4fbe86367d11a4cd03c11", size = 1067837, upload-time = "2025-07-19T19:23:59.888Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/0905597af0e78748909ef58418442a480ddd93e9fc89b0ca9ab170c357c0/rignore-0.6.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e07d9c5270fc869bc431aadcfb6ed0447f89b8aafaa666914c077435dc76a123", size = 1134959, upload-time = "2025-07-19T19:24:12.396Z" }, + { url = "https://files.pythonhosted.org/packages/cc/7d/0fa29adf9183b61947ce6dc8a1a9779a8ea16573f557be28ec893f6ddbaa/rignore-0.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7a6ccc0ea83d2c0c6df6b166f2acacedcc220a516436490f41e99a5ae73b6019", size = 1109708, upload-time = "2025-07-19T19:24:24.176Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a7/92892ed86b2e36da403dd3a0187829f2d880414cef75bd612bfdf4dedebc/rignore-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:536392c5ec91755db48389546c833c4ab1426fe03e5a8522992b54ef8a244e7e", size = 1120546, upload-time = "2025-07-19T19:24:36.377Z" }, + { url = "https://files.pythonhosted.org/packages/31/1b/d29ae1fe901d523741d6d1d3ffe0d630734dd0ed6b047628a69c1e15ea44/rignore-0.6.4-cp312-cp312-win32.whl", hash = "sha256:f5f9dca46fc41c0a1e236767f68be9d63bdd2726db13a0ae3a30f68414472969", size = 642005, upload-time = "2025-07-19T19:24:56.671Z" }, + { url = "https://files.pythonhosted.org/packages/1a/41/a224944824688995374e4525115ce85fecd82442fc85edd5bcd81f4f256d/rignore-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:e02eecb9e1b9f9bf7c9030ae73308a777bed3b2486204cc74dfcfbe699ab1497", size = 720358, upload-time = "2025-07-19T19:24:49.959Z" }, + { url = "https://files.pythonhosted.org/packages/db/a3/edd7d0d5cc0720de132b6651cef95ee080ce5fca11c77d8a47db848e5f90/rignore-0.6.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2b3b1e266ce45189240d14dfa1057f8013ea34b9bc8b3b44125ec8d25fdb3985", size = 885304, upload-time = "2025-07-19T19:23:54.268Z" }, + { url = "https://files.pythonhosted.org/packages/93/a1/d8d2fb97a6548307507d049b7e93885d4a0dfa1c907af5983fd9f9362a21/rignore-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45fe803628cc14714df10e8d6cdc23950a47eb9eb37dfea9a4779f4c672d2aa0", size = 818799, upload-time = "2025-07-19T19:23:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/949981fcc180ad5ba7b31c52e78b74b2dea6b7bf744ad4c0c4b212f6da78/rignore-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e439f034277a947a4126e2da79dbb43e33d73d7c09d3d72a927e02f8a16f59aa", size = 892024, upload-time = "2025-07-19T19:22:36.18Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d3/9042d701a8062d9c88f87760bbc2695ee2c23b3f002d34486b72a85f8efe/rignore-0.6.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b5121650ae24621154c7bdba8b8970b0739d8146505c9f38e0cda9385d1004", size = 871430, upload-time = "2025-07-19T19:22:49.62Z" }, + { url = "https://files.pythonhosted.org/packages/eb/50/3370249b984212b7355f3d9241aa6d02e706067c6d194a2614dfbc0f5b27/rignore-0.6.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b0957b585ab48a445cf8ac1dbc33a272ab060835e583b4f95aa8c67c23fb2b", size = 1160559, upload-time = "2025-07-19T19:23:01.629Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6f/2ad7f925838091d065524f30a8abda846d1813eee93328febf262b5cda21/rignore-0.6.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50359e0d5287b5e2743bd2f2fbf05df619c8282fd3af12f6628ff97b9675551d", size = 939947, upload-time = "2025-07-19T19:23:14.608Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/626ec94d62475ae7ef8b00ef98cea61cbea52a389a666703c97c4673d406/rignore-0.6.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe18096dcb1596757dfe0b412aab6d32564473ae7ee58dea0a8b4be5b1a2e3b", size = 949471, upload-time = "2025-07-19T19:23:37.521Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c3/699c4f03b3c46f4b5c02f17a0a339225da65aad547daa5b03001e7c6a382/rignore-0.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b79c212d9990a273ad91e8d9765e1766ef6ecedd3be65375d786a252762ba385", size = 974912, upload-time = "2025-07-19T19:23:27.13Z" }, + { url = "https://files.pythonhosted.org/packages/cd/35/04626c12f9f92a9fc789afc2be32838a5d9b23b6fa8b2ad4a8625638d15b/rignore-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6ffa7f2a8894c65aa5dc4e8ac8bbdf39a326c0c6589efd27686cfbb48f0197d", size = 1067281, upload-time = "2025-07-19T19:24:01.016Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9c/8f17baf3b984afea151cb9094716f6f1fb8e8737db97fc6eb6d494bd0780/rignore-0.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a63f5720dffc8d8fb0a4d02fafb8370a4031ebf3f99a4e79f334a91e905b7349", size = 1134414, upload-time = "2025-07-19T19:24:13.534Z" }, + { url = "https://files.pythonhosted.org/packages/10/88/ef84ffa916a96437c12cefcc39d474122da9626d75e3a2ebe09ec5d32f1b/rignore-0.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ce33982da47ac5dc09d19b04fa8d7c9aa6292fc0bd1ecf33076989faa8886094", size = 1109330, upload-time = "2025-07-19T19:24:25.303Z" }, + { url = "https://files.pythonhosted.org/packages/27/43/2ada5a2ec03b82e903610a1c483f516f78e47700ee6db9823f739e08b3af/rignore-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d899621867aa266824fbd9150e298f19d25b93903ef0133c09f70c65a3416eca", size = 1120381, upload-time = "2025-07-19T19:24:37.798Z" }, + { url = "https://files.pythonhosted.org/packages/3b/99/e7bcc643085131cb14dbea772def72bf1f6fe9037171ebe177c4f228abc8/rignore-0.6.4-cp313-cp313-win32.whl", hash = "sha256:d0615a6bf4890ec5a90b5fb83666822088fbd4e8fcd740c386fcce51e2f6feea", size = 641761, upload-time = "2025-07-19T19:24:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/d9/25/7798908044f27dea1a8abdc75c14523e33770137651e5f775a15143f4218/rignore-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:145177f0e32716dc2f220b07b3cde2385b994b7ea28d5c96fbec32639e9eac6f", size = 719876, upload-time = "2025-07-19T19:24:51.125Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e3/ae1e30b045bf004ad77bbd1679b9afff2be8edb166520921c6f29420516a/rignore-0.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55bf8f9bbd186f58ab646b4a08718c77131d28a9004e477612b0cbbd5202db2", size = 891776, upload-time = "2025-07-19T19:22:37.78Z" }, + { url = "https://files.pythonhosted.org/packages/45/a9/1193e3bc23ca0e6eb4f17cf4b99971237f97cfa6f241d98366dff90a6d09/rignore-0.6.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2521f7bf3ee1f2ab22a100a3a4eed39a97b025804e5afe4323528e9ce8f084a5", size = 871442, upload-time = "2025-07-19T19:22:50.972Z" }, + { url = "https://files.pythonhosted.org/packages/20/83/4c52ae429a0b2e1ce667e35b480e9a6846f9468c443baeaed5d775af9485/rignore-0.6.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc35773a8a9c119359ef974d0856988d4601d4daa6f532c05f66b4587cf35bc", size = 1159844, upload-time = "2025-07-19T19:23:02.751Z" }, + { url = "https://files.pythonhosted.org/packages/c1/2f/c740f5751f464c937bfe252dc15a024ae081352cfe80d94aa16d6a617482/rignore-0.6.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b665b1ea14457d7b49e834baabc635a3b8c10cfb5cca5c21161fabdbfc2b850e", size = 939456, upload-time = "2025-07-19T19:23:15.72Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/68dbb08ac0edabf44dd144ff546a3fb0253c5af708e066847df39fc9188f/rignore-0.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c7fd339f344a8548724f289495b835bed7b81174a0bc1c28c6497854bd8855db", size = 1067070, upload-time = "2025-07-19T19:24:02.803Z" }, + { url = "https://files.pythonhosted.org/packages/3b/3a/7e7ea6f0d31d3f5beb0f2cf2c4c362672f5f7f125714458673fc579e2bed/rignore-0.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:91dc94b1cc5af8d6d25ce6edd29e7351830f19b0a03b75cb3adf1f76d00f3007", size = 1134598, upload-time = "2025-07-19T19:24:15.039Z" }, + { url = "https://files.pythonhosted.org/packages/7e/06/1b3307f6437d29bede5a95738aa89e6d910ba68d4054175c9f60d8e2c6b1/rignore-0.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4d1918221a249e5342b60fd5fa513bf3d6bf272a8738e66023799f0c82ecd788", size = 1108862, upload-time = "2025-07-19T19:24:26.765Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d5/b37c82519f335f2c472a63fc6215c6f4c51063ecf3166e3acf508011afbd/rignore-0.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:240777332b859dc89dcba59ab6e3f1e062bc8e862ffa3e5f456e93f7fd5cb415", size = 1120002, upload-time = "2025-07-19T19:24:38.952Z" }, + { url = "https://files.pythonhosted.org/packages/ac/72/2f05559ed5e69bdfdb56ea3982b48e6c0017c59f7241f7e1c5cae992b347/rignore-0.6.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b0e548753e55cc648f1e7b02d9f74285fe48bb49cec93643d31e563773ab3f", size = 949454, upload-time = "2025-07-19T19:23:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/0b/92/186693c8f838d670510ac1dfb35afbe964320fbffb343ba18f3d24441941/rignore-0.6.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6971ac9fdd5a0bd299a181096f091c4f3fd286643adceba98eccc03c688a6637", size = 974663, upload-time = "2025-07-19T19:23:28.24Z" }, + { url = "https://files.pythonhosted.org/packages/85/4d/5a69ea5ae7de78eddf0a0699b6dbd855f87c1436673425461188ea39662f/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40f493eef4b191777ba6d16879e3f73836142e04480d2e2f483675d652e6b559", size = 895408, upload-time = "2025-07-19T19:22:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c3/b6cdf9b676d6774c5de3ca04a5f4dbaffae3bb06bdee395e095be24f098e/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6790635e4df35333e27cd9e8b31d1d559826cf8b52f2c374b81ab698ac0140cf", size = 873042, upload-time = "2025-07-19T19:22:54.663Z" }, + { url = "https://files.pythonhosted.org/packages/80/25/61182149b2f2ca86c22c6253b361ec0e983e60e913ca75588a7d559b41eb/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e326dab28787f07c6987c04686d4ad9d4b1e1caca1a15b85d443f91af2e133d2", size = 1162036, upload-time = "2025-07-19T19:23:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/db/44/7fe55c2b7adc8c90dc8709ef2fac25fa526b0c8bfd1090af4e6b33c2e42f/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd24cb0f58c6036b0f64ac6fc3f759b7f0de5506fa9f5a65e9d57f8cf44a026d", size = 940381, upload-time = "2025-07-19T19:23:19.364Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a3/8cc0c9a9db980a1589007d0fedcaf41475820e0cd4950a5f6eeb8ebc0ee0/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36cb95b0acae3c88b99a39f4246b395fd983848f3ec85ff26531d638b6584a45", size = 951924, upload-time = "2025-07-19T19:23:42.209Z" }, + { url = "https://files.pythonhosted.org/packages/07/f2/4f2c88307c84801d6c772c01e8d856deaa8e85117180b88aaa0f41d4f86f/rignore-0.6.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dfc954973429ce545d06163d87a6bae0ccea5703adbc957ee3d332c9592a58eb", size = 976515, upload-time = "2025-07-19T19:23:31.524Z" }, + { url = "https://files.pythonhosted.org/packages/a4/bd/f701ddf897cf5e3f394107e6dad147216b3a0d84e9d53d7a5fed7cc97d26/rignore-0.6.4-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:cbed37d7c128b58ab9ade80e131efc4a48b6d045cd0bd1d3254cbb6b4a0ad67e", size = 1069896, upload-time = "2025-07-19T19:24:06.24Z" }, + { url = "https://files.pythonhosted.org/packages/00/52/1ae54afad26aafcfee1b44a36b27bb0dd63f1c23081e1599dbf681368925/rignore-0.6.4-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:a0db910ef867d6ca2d52fefd22d8b6b63b20ec61661e2ad57e5c425a4e39431a", size = 1136337, upload-time = "2025-07-19T19:24:18.529Z" }, + { url = "https://files.pythonhosted.org/packages/85/9a/3b74aabb69ed118d0b493afa62d1aacc3bf12b8f11bf682a3c02174c3068/rignore-0.6.4-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d664443a0a71d0a7d669adf32be59c4249bbff8b2810960f1b91d413ee4cf6b8", size = 1111677, upload-time = "2025-07-19T19:24:30.21Z" }, + { url = "https://files.pythonhosted.org/packages/70/7d/bd0f6c1bc89c80b116b526b77cdd5263c0ad218d5416aebf4ca9cce9ca73/rignore-0.6.4-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:b9f6f1d91429b4a6772152848815cf1459663796b7b899a0e15d9198e32c9371", size = 1122823, upload-time = "2025-07-19T19:24:42.476Z" }, + { url = "https://files.pythonhosted.org/packages/33/a1/daaa2df10dfa6d87c896a5783c8407c284530d5a056307d1f55a8ef0c533/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b3da26d5a35ab15525b68d30b7352ad2247321f5201fc7e50ba6d547f78d5ea", size = 895772, upload-time = "2025-07-19T19:22:43.423Z" }, + { url = "https://files.pythonhosted.org/packages/35/e6/65130a50cd3ed11c967034dfd653e160abb7879fb4ee338a1cccaeda7acd/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43028f3587558231d9fa68accff58c901dc50fd7bbc5764d3ee3df95290f6ebf", size = 873093, upload-time = "2025-07-19T19:22:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/32/c4/02ead1274ce935c59f2bb3deaaaa339df9194bc40e3c2d8d623e31e47ec4/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc56f1fcab7740751b98fead67b98ba64896424d8c834ea22089568db4e36dfa", size = 1162199, upload-time = "2025-07-19T19:23:08.376Z" }, + { url = "https://files.pythonhosted.org/packages/78/0c/94a4edce0e80af69f200cc35d8da4c727c52d28f0c9d819b388849ae8ef6/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6033f2280898535a5f69935e08830a4e49ff1e29ef2c3f9a2b9ced59de06fdbf", size = 940176, upload-time = "2025-07-19T19:23:20.862Z" }, + { url = "https://files.pythonhosted.org/packages/43/92/21ec579c999a3ed4d1b2a5926a9d0edced7c65d8ac353bc9120d49b05a64/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f5ac0c4e6a24be88f3821e101ef4665e9e1dc015f9e45109f32fed71dbcdafa", size = 951632, upload-time = "2025-07-19T19:23:43.32Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/72e7ba244222b9efdeb18f9974d6f1e30cf5a2289e1b482a1e8b3ebee90f/rignore-0.6.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8906ac8dd585ece83b1346e0470260a1951058cc0ef5a17542069bde4aa3f42f", size = 976923, upload-time = "2025-07-19T19:23:32.678Z" }, + { url = "https://files.pythonhosted.org/packages/8e/14/e754c12bc953c7fa309687cd30a6ea95e5721168fb0b2a99a34bff24be5c/rignore-0.6.4-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:14d095622969504a2e56f666286202dad583f08d3347b7be2d647ddfd7a9bf47", size = 1069861, upload-time = "2025-07-19T19:24:07.671Z" }, + { url = "https://files.pythonhosted.org/packages/a6/24/ba2bdaf04a19b5331c051b9d480e8daca832bed4aeaa156d6d679044c06c/rignore-0.6.4-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:30f3d688df7eb4850318f1b5864d14f2c5fe5dbf3803ed0fc8329d2a7ad560dc", size = 1136368, upload-time = "2025-07-19T19:24:19.68Z" }, + { url = "https://files.pythonhosted.org/packages/83/48/7cf52353299e02aa629150007fa75f4b91d99b4f2fa536f2e24ead810116/rignore-0.6.4-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:028f62a7b0a6235bb3f03c9e7f342352e7fa4b3f08c761c72f9de8faee40ed9c", size = 1111714, upload-time = "2025-07-19T19:24:31.717Z" }, + { url = "https://files.pythonhosted.org/packages/84/9c/3881ad34f01942af0cf713e25e476bf851e04e389cc3ff146c3b459ab861/rignore-0.6.4-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:7e6c425603db2c147eace4f752ca3cd4551e7568c9d332175d586c68bcbe3d8d", size = 1122433, upload-time = "2025-07-19T19:24:43.973Z" }, +] + [[package]] name = "rpds-py" version = "0.26.0" @@ -5162,6 +5356,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload-time = "2024-04-07T00:01:07.438Z" }, ] +[[package]] +name = "sentry-sdk" +version = "2.34.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/38/10d6bfe23df1bfc65ac2262ed10b45823f47f810b0057d3feeea1ca5c7ed/sentry_sdk-2.34.1.tar.gz", hash = "sha256:69274eb8c5c38562a544c3e9f68b5be0a43be4b697f5fd385bf98e4fbe672687", size = 336969, upload-time = "2025-07-30T11:13:37.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/3e/bb34de65a5787f76848a533afbb6610e01fbcdd59e76d8679c254e02255c/sentry_sdk-2.34.1-py2.py3-none-any.whl", hash = "sha256:b7a072e1cdc5abc48101d5146e1ae680fa81fe886d8d95aaa25a0b450c818d32", size = 357743, upload-time = "2025-07-30T11:13:36.145Z" }, +] + [[package]] name = "setuptools" version = "80.9.0" @@ -5171,6 +5378,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -5623,6 +5839,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", size = 40791, upload-time = "2025-01-21T18:45:24.584Z" }, ] +[[package]] +name = "typer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" }, +] + [[package]] name = "types-docker" version = "7.1.0.20250705" @@ -5750,6 +5981,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/76/44a55515e8c9505aa1420aebacf4dd82552e5e15691654894e90d0bd051a/uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f", size = 1442019, upload-time = "2024-10-14T23:37:20.068Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/62d5800358a78cc25c8a6c72ef8b10851bdb8cca22e14d9c74167b7f86da/uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d", size = 801898, upload-time = "2024-10-14T23:37:22.663Z" }, + { url = "https://files.pythonhosted.org/packages/f3/96/63695e0ebd7da6c741ccd4489b5947394435e198a1382349c17b1146bb97/uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26", size = 3827735, upload-time = "2024-10-14T23:37:25.129Z" }, + { url = "https://files.pythonhosted.org/packages/61/e0/f0f8ec84979068ffae132c58c79af1de9cceeb664076beea86d941af1a30/uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb", size = 3825126, upload-time = "2024-10-14T23:37:27.59Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fe/5e94a977d058a54a19df95f12f7161ab6e323ad49f4dabc28822eb2df7ea/uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f", size = 3705789, upload-time = "2024-10-14T23:37:29.385Z" }, + { url = "https://files.pythonhosted.org/packages/26/dd/c7179618e46092a77e036650c1f056041a028a35c4d76945089fcfc38af8/uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c", size = 3800523, upload-time = "2024-10-14T23:37:32.048Z" }, + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, +] + [[package]] name = "versioneer" version = "0.29" @@ -5805,6 +6079,106 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] +[[package]] +name = "watchfiles" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/dd/579d1dc57f0f895426a1211c4ef3b0cb37eb9e642bb04bdcd962b5df206a/watchfiles-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:27f30e14aa1c1e91cb653f03a63445739919aef84c8d2517997a83155e7a2fcc", size = 405757, upload-time = "2025-06-15T19:04:51.058Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/7a0318cd874393344d48c34d53b3dd419466adf59a29ba5b51c88dd18b86/watchfiles-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3366f56c272232860ab45c77c3ca7b74ee819c8e1f6f35a7125556b198bbc6df", size = 397511, upload-time = "2025-06-15T19:04:52.79Z" }, + { url = "https://files.pythonhosted.org/packages/06/be/503514656d0555ec2195f60d810eca29b938772e9bfb112d5cd5ad6f6a9e/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8412eacef34cae2836d891836a7fff7b754d6bcac61f6c12ba5ca9bc7e427b68", size = 450739, upload-time = "2025-06-15T19:04:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0d/a05dd9e5f136cdc29751816d0890d084ab99f8c17b86f25697288ca09bc7/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df670918eb7dd719642e05979fc84704af913d563fd17ed636f7c4783003fdcc", size = 458106, upload-time = "2025-06-15T19:04:55.607Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fa/9cd16e4dfdb831072b7ac39e7bea986e52128526251038eb481effe9f48e/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7642b9bc4827b5518ebdb3b82698ada8c14c7661ddec5fe719f3e56ccd13c97", size = 484264, upload-time = "2025-06-15T19:04:57.009Z" }, + { url = "https://files.pythonhosted.org/packages/32/04/1da8a637c7e2b70e750a0308e9c8e662ada0cca46211fa9ef24a23937e0b/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:199207b2d3eeaeb80ef4411875a6243d9ad8bc35b07fc42daa6b801cc39cc41c", size = 597612, upload-time = "2025-06-15T19:04:58.409Z" }, + { url = "https://files.pythonhosted.org/packages/30/01/109f2762e968d3e58c95731a206e5d7d2a7abaed4299dd8a94597250153c/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a479466da6db5c1e8754caee6c262cd373e6e6c363172d74394f4bff3d84d7b5", size = 477242, upload-time = "2025-06-15T19:04:59.786Z" }, + { url = "https://files.pythonhosted.org/packages/b5/b8/46f58cf4969d3b7bc3ca35a98e739fa4085b0657a1540ccc29a1a0bc016f/watchfiles-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935f9edd022ec13e447e5723a7d14456c8af254544cefbc533f6dd276c9aa0d9", size = 453148, upload-time = "2025-06-15T19:05:01.103Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/8267594263b1770f1eb76914940d7b2d03ee55eca212302329608208e061/watchfiles-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8076a5769d6bdf5f673a19d51da05fc79e2bbf25e9fe755c47595785c06a8c72", size = 626574, upload-time = "2025-06-15T19:05:02.582Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2f/7f2722e85899bed337cba715723e19185e288ef361360718973f891805be/watchfiles-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86b1e28d4c37e89220e924305cd9f82866bb0ace666943a6e4196c5df4d58dcc", size = 624378, upload-time = "2025-06-15T19:05:03.719Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/64c88ec43d90a568234d021ab4b2a6f42a5230d772b987c3f9c00cc27b8b/watchfiles-1.1.0-cp310-cp310-win32.whl", hash = "sha256:d1caf40c1c657b27858f9774d5c0e232089bca9cb8ee17ce7478c6e9264d2587", size = 279829, upload-time = "2025-06-15T19:05:04.822Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/a9c1ed33de7af80935e4eac09570de679c6e21c07070aa99f74b4431f4d6/watchfiles-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a89c75a5b9bc329131115a409d0acc16e8da8dfd5867ba59f1dd66ae7ea8fa82", size = 292192, upload-time = "2025-06-15T19:05:06.348Z" }, + { url = "https://files.pythonhosted.org/packages/8b/78/7401154b78ab484ccaaeef970dc2af0cb88b5ba8a1b415383da444cdd8d3/watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2", size = 405751, upload-time = "2025-06-15T19:05:07.679Z" }, + { url = "https://files.pythonhosted.org/packages/76/63/e6c3dbc1f78d001589b75e56a288c47723de28c580ad715eb116639152b5/watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c", size = 397313, upload-time = "2025-06-15T19:05:08.764Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a2/8afa359ff52e99af1632f90cbf359da46184207e893a5f179301b0c8d6df/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d", size = 450792, upload-time = "2025-06-15T19:05:09.869Z" }, + { url = "https://files.pythonhosted.org/packages/1d/bf/7446b401667f5c64972a57a0233be1104157fc3abf72c4ef2666c1bd09b2/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7", size = 458196, upload-time = "2025-06-15T19:05:11.91Z" }, + { url = "https://files.pythonhosted.org/packages/58/2f/501ddbdfa3fa874ea5597c77eeea3d413579c29af26c1091b08d0c792280/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c", size = 484788, upload-time = "2025-06-15T19:05:13.373Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/9c18eb2eb5c953c96bc0e5f626f0e53cfef4bd19bd50d71d1a049c63a575/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575", size = 597879, upload-time = "2025-06-15T19:05:14.725Z" }, + { url = "https://files.pythonhosted.org/packages/8b/6c/1467402e5185d89388b4486745af1e0325007af0017c3384cc786fff0542/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8", size = 477447, upload-time = "2025-06-15T19:05:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a1/ec0a606bde4853d6c4a578f9391eeb3684a9aea736a8eb217e3e00aa89a1/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f", size = 453145, upload-time = "2025-06-15T19:05:17.17Z" }, + { url = "https://files.pythonhosted.org/packages/90/b9/ef6f0c247a6a35d689fc970dc7f6734f9257451aefb30def5d100d6246a5/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4", size = 626539, upload-time = "2025-06-15T19:05:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/34/44/6ffda5537085106ff5aaa762b0d130ac6c75a08015dd1621376f708c94de/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d", size = 624472, upload-time = "2025-06-15T19:05:19.588Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e3/71170985c48028fa3f0a50946916a14055e741db11c2e7bc2f3b61f4d0e3/watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2", size = 279348, upload-time = "2025-06-15T19:05:20.856Z" }, + { url = "https://files.pythonhosted.org/packages/89/1b/3e39c68b68a7a171070f81fc2561d23ce8d6859659406842a0e4bebf3bba/watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12", size = 292607, upload-time = "2025-06-15T19:05:21.937Z" }, + { url = "https://files.pythonhosted.org/packages/61/9f/2973b7539f2bdb6ea86d2c87f70f615a71a1fc2dba2911795cea25968aea/watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a", size = 285056, upload-time = "2025-06-15T19:05:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339, upload-time = "2025-06-15T19:05:24.516Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409, upload-time = "2025-06-15T19:05:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939, upload-time = "2025-06-15T19:05:26.494Z" }, + { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270, upload-time = "2025-06-15T19:05:27.466Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370, upload-time = "2025-06-15T19:05:28.548Z" }, + { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654, upload-time = "2025-06-15T19:05:29.997Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667, upload-time = "2025-06-15T19:05:31.172Z" }, + { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213, upload-time = "2025-06-15T19:05:32.299Z" }, + { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718, upload-time = "2025-06-15T19:05:33.415Z" }, + { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098, upload-time = "2025-06-15T19:05:34.534Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209, upload-time = "2025-06-15T19:05:35.577Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786, upload-time = "2025-06-15T19:05:36.559Z" }, + { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343, upload-time = "2025-06-15T19:05:37.5Z" }, + { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" }, + { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" }, + { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" }, + { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" }, + { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" }, + { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" }, + { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" }, + { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" }, + { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" }, + { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" }, + { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" }, + { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" }, + { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" }, + { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" }, + { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" }, + { url = "https://files.pythonhosted.org/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114, upload-time = "2025-06-15T19:06:06.186Z" }, + { url = "https://files.pythonhosted.org/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879, upload-time = "2025-06-15T19:06:07.369Z" }, + { url = "https://files.pythonhosted.org/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026, upload-time = "2025-06-15T19:06:08.476Z" }, + { url = "https://files.pythonhosted.org/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917, upload-time = "2025-06-15T19:06:09.988Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602, upload-time = "2025-06-15T19:06:11.088Z" }, + { url = "https://files.pythonhosted.org/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758, upload-time = "2025-06-15T19:06:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601, upload-time = "2025-06-15T19:06:13.391Z" }, + { url = "https://files.pythonhosted.org/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936, upload-time = "2025-06-15T19:06:14.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243, upload-time = "2025-06-15T19:06:16.232Z" }, + { url = "https://files.pythonhosted.org/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073, upload-time = "2025-06-15T19:06:17.457Z" }, + { url = "https://files.pythonhosted.org/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872, upload-time = "2025-06-15T19:06:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877, upload-time = "2025-06-15T19:06:19.55Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645, upload-time = "2025-06-15T19:06:20.66Z" }, + { url = "https://files.pythonhosted.org/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424, upload-time = "2025-06-15T19:06:21.712Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584, upload-time = "2025-06-15T19:06:22.777Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675, upload-time = "2025-06-15T19:06:24.226Z" }, + { url = "https://files.pythonhosted.org/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363, upload-time = "2025-06-15T19:06:25.42Z" }, + { url = "https://files.pythonhosted.org/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240, upload-time = "2025-06-15T19:06:26.552Z" }, + { url = "https://files.pythonhosted.org/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607, upload-time = "2025-06-15T19:06:27.606Z" }, + { url = "https://files.pythonhosted.org/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315, upload-time = "2025-06-15T19:06:29.076Z" }, + { url = "https://files.pythonhosted.org/packages/be/7c/a3d7c55cfa377c2f62c4ae3c6502b997186bc5e38156bafcb9b653de9a6d/watchfiles-1.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a6fd40bbb50d24976eb275ccb55cd1951dfb63dbc27cae3066a6ca5f4beabd5", size = 406748, upload-time = "2025-06-15T19:06:44.2Z" }, + { url = "https://files.pythonhosted.org/packages/38/d0/c46f1b2c0ca47f3667b144de6f0515f6d1c670d72f2ca29861cac78abaa1/watchfiles-1.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f811079d2f9795b5d48b55a37aa7773680a5659afe34b54cc1d86590a51507d", size = 398801, upload-time = "2025-06-15T19:06:45.774Z" }, + { url = "https://files.pythonhosted.org/packages/70/9c/9a6a42e97f92eeed77c3485a43ea96723900aefa3ac739a8c73f4bff2cd7/watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2726d7bfd9f76158c84c10a409b77a320426540df8c35be172444394b17f7ea", size = 451528, upload-time = "2025-06-15T19:06:46.791Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/98c7f4f7ce7ff03023cf971cd84a3ee3b790021ae7584ffffa0eb2554b96/watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df32d59cb9780f66d165a9a7a26f19df2c7d24e3bd58713108b41d0ff4f929c6", size = 454095, upload-time = "2025-06-15T19:06:48.211Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6b/686dcf5d3525ad17b384fd94708e95193529b460a1b7bf40851f1328ec6e/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3", size = 406910, upload-time = "2025-06-15T19:06:49.335Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d3/71c2dcf81dc1edcf8af9f4d8d63b1316fb0a2dd90cbfd427e8d9dd584a90/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c", size = 398816, upload-time = "2025-06-15T19:06:50.433Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fa/12269467b2fc006f8fce4cd6c3acfa77491dd0777d2a747415f28ccc8c60/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432", size = 451584, upload-time = "2025-06-15T19:06:51.834Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009, upload-time = "2025-06-15T19:06:52.896Z" }, +] + [[package]] name = "wcwidth" version = "0.2.13" diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 8f821cc2..b3ee23d6 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useRef } from "react"; import { Link } from "react-router-dom"; interface FileUpdate { @@ -9,14 +9,24 @@ interface FileUpdate { function App() { const [isConnected, setIsConnected] = useState(false); + const wsRef = useRef(null); + const reconnectTimeoutRef = useRef(null); + const reconnectAttemptsRef = useRef(0); + const maxReconnectAttempts = 5; + const baseDelay = 1000; // 1 second - useEffect(() => { - // Connect to WebSocket for file updates - const ws = new WebSocket("ws://localhost:4789/ws"); + const connectWebSocket = () => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + return; // Already connected + } + + const ws = new WebSocket("ws://localhost:8000/ws"); + wsRef.current = ws; ws.onopen = () => { console.log("Connected to file watcher"); setIsConnected(true); + reconnectAttemptsRef.current = 0; // Reset reconnect attempts on successful connection }; ws.onmessage = (event) => { @@ -28,18 +38,56 @@ function App() { } }; - ws.onclose = () => { - console.log("Disconnected from file watcher"); + ws.onclose = (event) => { + console.log("Disconnected from file watcher", event.code, event.reason); setIsConnected(false); + + // Attempt to reconnect if not a normal closure + if ( + event.code !== 1000 && + reconnectAttemptsRef.current < maxReconnectAttempts + ) { + scheduleReconnect(); + } }; ws.onerror = (error) => { console.error("WebSocket error:", error); setIsConnected(false); }; + }; + + const scheduleReconnect = () => { + if (reconnectTimeoutRef.current) { + clearTimeout(reconnectTimeoutRef.current); + } + + const delay = baseDelay * Math.pow(2, reconnectAttemptsRef.current); // Exponential backoff + console.log( + `Scheduling reconnect attempt ${ + reconnectAttemptsRef.current + 1 + } in ${delay}ms` + ); + + reconnectTimeoutRef.current = setTimeout(() => { + reconnectAttemptsRef.current++; + console.log( + `Attempting to reconnect (attempt ${reconnectAttemptsRef.current}/${maxReconnectAttempts})` + ); + connectWebSocket(); + }, delay); + }; + + useEffect(() => { + connectWebSocket(); return () => { - ws.close(); + if (reconnectTimeoutRef.current) { + clearTimeout(reconnectTimeoutRef.current); + } + if (wsRef.current) { + wsRef.current.close(); + } }; }, []); From bc23c882b989913ec9fa9496479953a00eebd78d Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 12:46:23 -0700 Subject: [PATCH 13/54] Refactor InputMetadata to make row_id optional and update type annotations in Agent class for tool results and tool call execution. --- eval_protocol/models.py | 2 +- .../pytest/default_agent_rollout_processor.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/eval_protocol/models.py b/eval_protocol/models.py index 0962bdab..bdddb559 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -190,7 +190,7 @@ class InputMetadata(BaseModel): model_config = ConfigDict(extra="allow") - row_id: str = Field(default_factory=generate_id, description="Unique string to ID the row") + row_id: Optional[str] = Field(default_factory=generate_id, description="Unique string to ID the row") completion_params: Optional[CompletionParams] = Field(None, description="Completion endpoint parameters used") dataset_info: Optional[Dict[str, Any]] = Field( None, description="Dataset row details: seed, system_prompt, environment_context, etc" diff --git a/eval_protocol/pytest/default_agent_rollout_processor.py b/eval_protocol/pytest/default_agent_rollout_processor.py index bb99834f..c7aeda5e 100644 --- a/eval_protocol/pytest/default_agent_rollout_processor.py +++ b/eval_protocol/pytest/default_agent_rollout_processor.py @@ -66,14 +66,16 @@ async def call_agent(self) -> str: tool_tasks.append(task) # Execute all tool calls in parallel - tool_results: List[List[TextContent]] = await asyncio.gather(*tool_tasks) + tool_results: List[tuple[str, List[TextContent]]] = await asyncio.gather(*tool_tasks) # Add all tool results to messages (they will be in the same order as tool_calls) for tool_call, (tool_call_id, content) in zip(message["tool_calls"], tool_results): self.append_message_and_log( Message( role="tool", - content=content, + content=[ + ChatCompletionContentPartTextParam(text=content.text, type="text") for content in content + ], tool_call_id=tool_call_id, ) ) @@ -88,7 +90,9 @@ async def _call_model( response = await self._policy._make_llm_call(messages=messages, tools=tools) return response["choices"][0]["message"] - async def _execute_tool_call(self, tool_call_id: str, tool_name: str, tool_args_dict: dict) -> tuple[str, str]: + async def _execute_tool_call( + self, tool_call_id: str, tool_name: str, tool_args_dict: dict + ) -> tuple[str, List[TextContent]]: """ Execute a single tool call and return the tool_call_id and content. This method is designed to be used with asyncio.gather() for parallel execution. From 02d44aff3c095ebb1dd5c67e2ab9280e913e3cf0 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 12:46:26 -0700 Subject: [PATCH 14/54] save --- .eval_protocol/datasets/2025-08-05.jsonl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl index 76f60dad..15edecf9 100644 --- a/.eval_protocol/datasets/2025-08-05.jsonl +++ b/.eval_protocol/datasets/2025-08-05.jsonl @@ -2,3 +2,6 @@ {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms and features.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment Fireworks AI platform features\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for specific deployment management concepts like scaling, monitoring, and configuration.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment scaling monitoring configuration\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more comprehensive deployment management information including deployment methods and best practices.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment methods best practices model serving\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for specific deployment commands and API endpoints.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI API deployment endpoints commands CLI\"}"}}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for deployment configuration and management features.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment configuration model settings\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management topics like autoscaling, load balancing, and deployment lifecycle.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI autoscaling load balancing deployment lifecycle management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the information I've gathered, let me provide you with a comprehensive guide on managing deployments on Fireworks AI:\n\n## Managing Deployments on Fireworks AI\n\n### 1. Deployment Performance Expectations\n\n**Initial Deployment:**\n- Should complete within minutes\n- Monitor deployment status actively\n\n**Scaling from Zero:**\n- May experience brief availability delays while the system scales up\n- This is normal behavior when scaling from zero instances\n\n**Troubleshooting:**\n- If deployment takes over 1 hour, this typically indicates a crash\n- Contact support if deployment times are unusually long\n\n### 2. Key Deployment Management Commands\n\nHere are the essential commands you'll need:\n\n```bash\n# Check deployment status\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/status\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Monitor scaling events\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/scaling\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Update deployment configuration\ncurl -X PATCH \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"min_instances\": 2,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7\n }'\n```\n\n### 3. Deployment Configuration Management\n\n**Basic Configuration:**\n```python\nimport fireworks.client\n\n# Configure deployment settings\ndeployment_config = {\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"deployment_name\": \"my-production-model\",\n \"min_instances\": 1,\n \"max_instances\": 5,\n \"scaling_threshold\": 0.8,\n \"timeout\": 30\n}\n\n# Create deployment\nresponse = fireworks.client.deployments.create(\n model=deployment_config[\"model\"],\n deployment_name=deployment_config[\"deployment_name\"],\n min_instances=deployment_config[\"min_instances\"],\n max_instances=deployment_config[\"max_instances\"]\n)\n```\n\n### 4. Monitoring and Observability\n\n**Set up monitoring:**\n```python\nimport requests\nimport time\n\ndef monitor_deployment_health(deployment_id):\n \"\"\"Monitor deployment health and scaling events\"\"\"\n url = f\"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/metrics\"\n headers = {\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n \n response = requests.get(url, headers=headers)\n metrics = response.json()\n \n return {\n \"cpu_utilization\": metrics.get(\"cpu_utilization\"),\n \"memory_usage\": metrics.get(\"memory_usage\"),\n \"active_instances\": metrics.get(\"active_instances\"),\n \"request_count\": metrics.get(\"request_count\"),\n \"error_rate\": metrics.get(\"error_rate\")\n }\n\n# Continuous monitoring loop\nwhile True:\n health = monitor_deployment_health(\"your-deployment-id\")\n print(f\"Active instances: {health['active_instances']}\")\n print(f\"CPU utilization: {health['cpu_utilization']}%\")\n time.sleep(60) # Check every minute\n```\n\n### 5. Autoscaling Configuration\n\n**Configure autoscaling parameters:**\n```json\n{\n \"autoscaling\": {\n \"min_instances\": 1,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7,\n \"scale_up_cooldown\": 60,\n \"scale_down_cooldown\": 300,\n \"metrics\": {\n \"cpu\": {\n \"target\": 70,\n \"type\": \"Utilization\"\n },\n \"memory\": {\n \"target\": 80,\n \"type\": \"Utilization\"\n }\n }\n }\n}\n```\n\n### 6. Deployment Lifecycle Management\n\n**Rolling updates:**\n```bash\n# Perform rolling update without downtime\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/update\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"strategy\": \"rolling\",\n \"max_unavailable\": 1,\n \"max_surge\": 1,\n \"new_config\": {\n \"image\": \"new-model-version:latest\",\n \"resources\": {\n \"cpu\": \"2\",\n \"memory\": \"4Gi\"\n }\n }\n }'\n```\n\n### 7. Best Practices for Deployment Management\n\n1. **Health Checks:**\n```python\ndef deployment_health_check(endpoint):\n \"\"\"Perform health check on deployment\"\"\"\n try:\n response = requests.get(\n f\"{endpoint}/health\",\n timeout=5,\n headers={\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n )\n return response.status_code == 200\n except:\n return False\n```\n\n2. **Resource Management:**\n```yaml\n# Recommended resource allocation\nresources:\n requests:\n cpu: 1000m\n memory: 2Gi\n limits:\n cpu: 2000m\n memory: 4Gi\n```\n\n3. **Monitoring Setup:**\n```python\n# Set up alerts for critical metrics\nalerts = {\n \"high_error_rate\": lambda x: x > 0.05,\n \"high_latency\": lambda x: x > 1000,\n \"low_availability\": lambda x: x < 0.99\n}\n```\n\n### 8. Deployment Rollback\n\n**Rollback to previous version:**\n```bash\n# Rollback deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/rollback\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"revision\": \"previous\",\n \"reason\": \"performance degradation\"\n }'\n```\n\n### 9. Cost Optimization\n\n**Set up cost monitoring:**\n```python\ndef calculate_deployment_cost(instance_type, hours_running):\n \"\"\"Calculate deployment costs\"\"\"\n pricing = {\n \"small\": 0.05, # per hour\n \"medium\": 0.10, # per hour\n \"large\": 0.20 # per hour\n }\n return pricing.get(instance_type, 0.10) * hours_running\n```\n\n### 10. Troubleshooting Common Issues\n\n**Deployment stuck:**\n```bash\n# Check deployment logs\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/logs\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Restart deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/restart\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\nThis comprehensive guide covers the key aspects of managing deployments on Fireworks AI. Start with basic monitoring and gradually implement more advanced features like autoscaling and rolling updates as your needs grow.","tool_calls":[]}],"input_metadata":{"row_id":"identify-be-unfriendly-girl"},"created_at":"2025-08-05T10:59:52.732744"} {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployments management create update delete scale\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"create deployment configuration scaling replicas\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Replica count (horizontal scaling)\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: The number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment management CLI commands create update list\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment configuration parameters GPU memory CPU firectl\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Which accelerator/GPU should I use?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/which-acceleratorgpu-should-i-use\nContent: It depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nWhich accelerator/GPU should I use?\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"list deployments get deployment status update deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl list deployments get deployment configuration examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"get deployment status check deployment health API endpoint\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: This endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment lifecycle states status monitoring health checks\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: Check Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment commands examples create list update delete\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management tutorial examples firectl commands\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, let me provide you with a comprehensive guide on managing deployments on Fireworks. I'll cover the key aspects including creation, configuration, scaling, monitoring, and deletion.\n\n## Managing Deployments on Fireworks: Complete Guide\n\n### 1. Prerequisites and Setup\n\nBefore managing deployments, ensure your account ID is properly configured to avoid \"invalid id\" errors:\n\n```bash\n# Configure your account ID\nexport FIREWORKS_ACCOUNT_ID=\"your-account-id\"\n```\n\n### 2. Creating Deployments\n\n#### Basic Deployment Creation\n```bash\n# Create a basic deployment\nfirectl create deployment \n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 5 \\\n --accelerator-type A100 \\\n --accelerator-count 1\n```\n\n#### Advanced Deployment Configuration\n```bash\n# Create deployment with comprehensive settings\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --display-name \"My Production Model\" \\\n --description \"High-performance deployment for production workloads\"\n```\n\n### 3. Deployment Scaling Configuration\n\n#### Horizontal Scaling (Replica Management)\n```bash\n# Auto-scaling configuration\nfirectl create deployment \\\n --min-replica-count 0 \\ # Scale to zero when unused\n --max-replica-count 10 \\ # Maximum replicas\n --autoscaling-policy.scale-up-window \"60s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"600s\"\n```\n\n#### Fixed Scaling\n```bash\n# Fixed number of replicas\nfirectl create deployment \\\n --min-replica-count 3 \\\n --max-replica-count 3 # Fixed at 3 replicas\n```\n\n### 4. GPU and Resource Configuration\n\n#### GPU Selection Guide\n- **A100**: Cost-effective for low-volume use cases\n- **H100**: Highest throughput for high-volume use cases\n- **H200**: Recommended for large models (DeepSeek V3/R1)\n- **MI300X**: Highest memory capacity, best for large models\n\n```bash\n# Different GPU configurations\nfirectl create deployment \\\n --accelerator-type A100 \\\n --accelerator-count 1\n\nfirectl create deployment \\\n --accelerator-type H100 \\\n --accelerator-count 8 # For large models like Llama 405B\n```\n\n### 5. Listing and Monitoring Deployments\n\n#### List All Deployments\n```bash\n# List all deployments in your account\nfirectl list deployments\n\n# Get specific deployment details\nfirectl get deployment \n```\n\n#### API-based Monitoring\n```bash\n# Check deployment status via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 6. Updating Deployments\n\n#### Update Configuration\n```bash\n# Update deployment via API\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 5,\n \"maxReplicaCount\": 10,\n \"displayName\": \"Updated Production Model\",\n \"description\": \"Increased capacity for higher load\"\n }'\n```\n\n#### Common Update Scenarios\n```bash\n# Scale up for increased demand\nfirectl update deployment \\\n --min-replica-count 5 \\\n --max-replica-count 15\n\n# Update display name and description\nfirectl update deployment \\\n --display-name \"Production Llama 3.1 70B\" \\\n --description \"Main production deployment for customer service\"\n```\n\n### 7. Deployment Lifecycle Management\n\n#### Deployment States\n- **STATE_UNSPECIFIED**: Initial state\n- **CREATING**: Deployment is being created\n- **RUNNING**: Deployment is active and serving requests\n- **UPDATING**: Configuration is being updated\n- **DELETING**: Deployment is being deleted\n- **ERROR**: Deployment encountered an error\n\n#### Health Monitoring\n```bash\n# Check deployment health\nfirectl get deployment --watch\n\n# Monitor via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" | jq '.status'\n```\n\n### 8. Deleting Deployments\n\n#### Soft Deletion (Default)\n```bash\n# Delete deployment (soft delete)\nfirectl delete deployment \n\n# API-based deletion\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n#### Hard Deletion\n```bash\n# Force deletion ignoring checks\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}?hard=true&ignoreChecks=true\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 9. Best Practices\n\n#### Cost Optimization\n```bash\n# Enable scale-to-zero for development environments\nfirectl create deployment \\\n --min-replica-count 0 \\\n --max-replica-count 2 \\\n --accelerator-type A100\n\n# Use reserved capacity for production\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --reserved-capacity true\n```\n\n#### Monitoring Setup\n```bash\n# Set up alerts for deployment health\n# Monitor key metrics:\n# - Replica count\n# - Request latency\n# - Error rates\n# - GPU utilization\n```\n\n### 10. Troubleshooting Common Issues\n\n#### Invalid ID Errors\n```bash\n# Fix account ID configuration\nexport FIREWORKS_ACCOUNT_ID=$(firectl get account | jq -r '.id')\necho \"Account ID: $FIREWORKS_ACCOUNT_ID\"\n```\n\n#### Scaling Issues\n```bash\n# Check for GPU stockouts\nfirectl get deployment --verbose\n\n# Verify resource availability\nfirectl list available-resources --region us-central1\n```\n\n### Complete Example: Production Deployment\n\n```bash\n#!/bin/bash\n# Production deployment script\n\nMODEL_NAME=\"llama-3.1-70b-instruct\"\nDEPLOYMENT_NAME=\"prod-llama-70b-$(date +%Y%m%d)\"\n\n# Create production deployment\nfirectl create deployment $MODEL_NAME \\\n --display-name $DEPLOYMENT_NAME \\\n --description \"Production Llama 3.1 70B for customer service\" \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --autoscaling-policy.scale-up-window \"30s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"1800s\"\n\n# Get deployment ID\nDEPLOYMENT_ID=$(firectl list deployments | grep $DEPLOYMENT_NAME | awk '{print $1}')\n\n# Monitor deployment status\necho \"Monitoring deployment: $DEPLOYMENT_ID\"\nfirectl get deployment $DEPLOYMENT_ID --watch\n```\n\nThis comprehensive guide covers all aspects of managing deployments on Fireworks, from basic creation to advanced scaling and monitoring strategies.","tool_calls":[]}],"input_metadata":{"row_id":"ask-calculate-final-president"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:02:19.141203"} {"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management Fireworks AI\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for more specific deployment-related terms.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"model deployment Fireworks AI console\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI deployment dashboard management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment-related documentation.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI model serving deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try a different approach and search for API documentation or deployment guides.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI API deployment endpoints management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI function calling deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment and scaling information.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI scaling deployment production models\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the available information, let me provide you with a comprehensive guide on managing deployments on Fireworks AI. While the search results are limited, I can share the key aspects of deployment management based on the platform's capabilities.\n\n## Managing Deployments on Fireworks AI\n\n### 1. **Deployment Overview**\nFireworks AI provides a streamlined approach to deploying AI models with minimal configuration. The platform handles infrastructure management automatically, allowing you to focus on model performance and application logic.\n\n### 2. **Key Deployment Management Features**\n\n#### **Model Deployment Options**\n```python\n# Basic model deployment using Fireworks client\nimport fireworks.client\n\n# Set your API key\nfireworks.client.api_key = \"your-api-key\"\n\n# Deploy a model for inference\nresponse = fireworks.client.ChatCompletion.create(\n model=\"accounts/fireworks/models/llama-v2-70b-chat\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### **Deployment Configuration**\n```python\n# Advanced deployment with custom configurations\ndeployment_config = {\n \"model\": \"your-model-name\",\n \"max_tokens\": 4096,\n \"temperature\": 0.7,\n \"top_p\": 0.9,\n \"deployment_type\": \"dedicated\" # or \"shared\"\n}\n```\n\n### 3. **Deployment Management Commands**\n\n#### **Deploy a New Model**\n```bash\n# Using Fireworks CLI (if available)\nfireworks deploy create \\\n --model \"accounts/your-account/models/your-model\" \\\n --name \"production-deployment\" \\\n --config production-config.yaml\n```\n\n#### **Scale Deployments**\n```bash\n# Scale up deployment instances\nfireworks deployment scale \\\n --deployment-id \"dep_123456\" \\\n --replicas 5 \\\n --min-instances 2 \\\n --max-instances 10\n```\n\n#### **Update Deployment Configuration**\n```bash\n# Update existing deployment\nfireworks deployment update \\\n --deployment-id \"dep_123456\" \\\n --config updated-config.yaml \\\n --rolling-update true\n```\n\n### 4. **Monitoring and Management**\n\n#### **Check Deployment Status**\n```python\nimport requests\n\n# Check deployment health\nresponse = requests.get(\n \"https://api.fireworks.ai/v1/deployments/dep_123456/status\",\n headers={\"Authorization\": f\"Bearer {api_key}\"}\n)\nstatus = response.json()\nprint(f\"Deployment Status: {status['state']}\")\n```\n\n#### **Monitor Performance Metrics**\n```python\n# Get deployment metrics\nmetrics = fireworks.client.Deployment.metrics(\n deployment_id=\"dep_123456\",\n time_range=\"24h\",\n metrics=[\"latency\", \"throughput\", \"error_rate\"]\n)\n```\n\n### 5. **Deployment Lifecycle Management**\n\n#### **Blue-Green Deployments**\n```yaml\n# deployment-config.yaml\ndeployment_strategy:\n type: \"blue_green\"\n traffic_split:\n blue: 90\n green: 10\n health_check:\n enabled: true\n path: \"/health\"\n interval: 30s\n```\n\n#### **A/B Testing Deployments**\n```python\n# Configure A/B testing between model versions\nab_config = {\n \"deployment_a\": {\n \"model\": \"model-v1\",\n \"traffic_percentage\": 50\n },\n \"deployment_b\": {\n \"model\": \"model-v2\", \n \"traffic_percentage\": 50\n },\n \"evaluation_metrics\": [\"latency\", \"accuracy\", \"user_satisfaction\"]\n}\n```\n\n### 6. **Production Deployment Best Practices**\n\n#### **Environment Management**\n```bash\n# Set up different environments\nfireworks env create production\nfireworks env create staging\nfireworks env create development\n\n# Deploy to specific environment\nfireworks deploy --env production --model your-model\n```\n\n#### **Configuration Management**\n```yaml\n# production-config.yaml\ndeployment:\n environment: production\n region: us-east-1\n auto_scaling:\n enabled: true\n min_instances: 2\n max_instances: 20\n target_cpu_utilization: 70\n monitoring:\n enabled: true\n metrics_collection: detailed\n alerting:\n - metric: latency_p99\n threshold: 1000ms\n action: scale_up\n```\n\n### 7. **Rollback and Recovery**\n\n#### **Rollback Deployment**\n```bash\n# Rollback to previous version\nfireworks deployment rollback \\\n --deployment-id \"dep_123456\" \\\n --version \"v1.2.3\" \\\n --strategy immediate\n```\n\n#### **Disaster Recovery**\n```python\n# Automated failover configuration\nfailover_config = {\n \"primary_region\": \"us-east-1\",\n \"backup_regions\": [\"us-west-2\", \"eu-west-1\"],\n \"failover_trigger\": {\n \"error_rate_threshold\": 5,\n \"latency_threshold\": 2000,\n \"health_check_failures\": 3\n }\n}\n```\n\n### 8. **Cost Optimization**\n\n#### **Auto-scaling Policies**\n```yaml\nscaling_policies:\n - type: \"target_tracking\"\n target_value: 70\n scale_up_cooldown: 300\n scale_down_cooldown: 300\n - type: \"scheduled\"\n schedule: \"0 2 * * *\" # Scale down at 2 AM\n min_instances: 1\n max_instances: 3\n```\n\n### 9. **Security and Access Control**\n\n#### **Deployment Access Management**\n```bash\n# Set deployment permissions\nfireworks deployment permissions set \\\n --deployment-id \"dep_123456\" \\\n --team \"engineering\" \\\n --role \"read-only\"\n\n# API key management\nfireworks api-keys create \\\n --deployment-id \"dep_123456\" \\\n --permissions \"read,write\" \\\n --expiry \"30d\"\n```\n\n### 10. **Integration with CI/CD**\n\n#### **GitHub Actions Integration**\n```yaml\n# .github/workflows/deploy.yml\nname: Deploy to Fireworks\non:\n push:\n branches: [main]\njobs:\n deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - name: Deploy to Fireworks\n run: |\n fireworks deploy create \\\n --model ${{ github.sha }} \\\n --config production-config.yaml\n```\n\n### Next Steps\n\n1. **Start with a staging deployment** to test your configuration\n2. **Set up monitoring** before going to production\n3. **Implement proper alerting** for critical metrics\n4. **Use infrastructure as code** for consistent deployments\n5. **Regular testing** of rollback procedures\n\nWould you like me to dive deeper into any specific aspect of deployment management, such as scaling strategies, monitoring setup, or cost optimization techniques?","tool_calls":[]}],"input_metadata":{"row_id":"miss-strong-gentle-side"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:04:58.857123"} +{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll retrieve their channels and recent messages.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"contain-current-brave-community"},"created_at":"2025-08-05T12:37:12.408698"} +{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"win-slow-office-student"},"created_at":"2025-08-05T12:40:45.354325"} +{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","function":{"arguments":"{}","name":"list_servers"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Available Servers (3):\\nFireworks AI Community (ID: 1234567890123456789, Members: 15420)\\nAI Development Hub (ID: 9876543210987654321, Members: 8234)\\nMachine Learning Enthusiasts (ID: 5556667778889990001, Members: 5678)\"}","type":"text"}],"tool_call_id":"functions.list_servers:0"},{"role":"assistant","content":"Now let me get the channels for each server:","tool_calls":[{"id":"functions.get_channels:1","function":{"arguments":"{\"server_id\": \"1234567890123456789\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:2","function":{"arguments":"{\"server_id\": \"9876543210987654321\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:3","function":{"arguments":"{\"server_id\": \"5556667778889990001\"}","name":"get_channels"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"server_name\": \"Fireworks AI Community\", \"server_id\": \"1234567890123456789\", \"channels\": {\"1111111111111111111\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion about AI and machine learning\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"2222222222222222222\": {\"name\": \"announcements\", \"type\": \"text\", \"position\": 1, \"archived\": false, \"category_id\": null, \"topic\": \"Important announcements and updates\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"3333333333333333333\": {\"name\": \"help-support\", \"type\": \"text\", \"position\": 2, \"archived\": false, \"category_id\": null, \"topic\": \"Get help with AI-related questions\", \"nsfw\": false, \"slowmode_delay\": 5, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"4444444444444444444\": {\"name\": \"voice-chat\", \"type\": \"voice\", \"position\": 3, \"archived\": false, \"category_id\": null, \"topic\": null, \"nsfw\": null, \"slowmode_delay\": null, \"user_limit\": 10, \"bitrate\": 64000, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"5555555555555555555\": {\"name\": \"fireworks-team\", \"type\": \"text\", \"position\": 4, \"archived\": false, \"category_id\": null, \"topic\": \"Internal team discussions\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}}, \"total_channels\": 5}","type":"text"}],"tool_call_id":"functions.get_channels:1"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"9876543210987654321\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:2"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"5556667778889990001\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:3"},{"role":"assistant","content":"Now let me read recent messages from each text channel. I'll use a recent timestamp to get the latest messages:","tool_calls":[{"id":"functions.read_messages:4","function":{"arguments":"{\"channel_id\": \"1111111111111111111\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:5","function":{"arguments":"{\"channel_id\": \"2222222222222222222\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:6","function":{"arguments":"{\"channel_id\": \"3333333333333333333\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:7","function":{"arguments":"{\"channel_id\": \"5555555555555555555\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:8","function":{"arguments":"{\"channel_id\": \"9999999999999999999\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 3 messages after December 19, 2024 at 12:00 AM UTC in general:\\n\\n Message 1 (id: 1000000000000000001):\\n Author: Alice#1234\\n Timestamp: August 05, 2025 at 05:42 PM UTC\\n Content: Has anyone tried the new Fireworks model? It's amazing!\\n Reactions: \\ud83d\\udc4d(5), \\ud83d\\udd25(3)\\n Message 2 (id: 1000000000000000002):\\n Author: Bob#5678\\n Timestamp: August 05, 2025 at 06:12 PM UTC\\n Content: Yes! The performance is incredible. What are you using it for?\\n Reactions: \\ud83d\\udc4d(2)\\n Reply to: message(id=1000000000000000001) by Alice#1234 at August 05, 2025 at 05:42 PM UTC\\n Message 3 (id: 1000000000000000003):\\n Author: Fireworks Team#9999 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 06:42 PM UTC\\n Content: We're glad you're enjoying it! Let us know if you have any questions.\\n Reactions: \\u2764\\ufe0f(8)\"}","type":"text"}],"tool_call_id":"functions.read_messages:4"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:5"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 2 messages after December 19, 2024 at 12:00 AM UTC in help-support:\\n\\n Message 1 (id: 2000000000000000001):\\n Author: Charlie#1111\\n Timestamp: August 05, 2025 at 04:42 PM UTC\\n Content: I'm having trouble with the API rate limits. Can someone help?\\n Message 2 (id: 2000000000000000002):\\n Author: Fireworks Support#8888 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 04:57 PM UTC\\n Content: Hi Charlie! Can you share your current usage and the specific error you're seeing?\\n Reactions: \\u2705(1)\\n Reply to: message(id=2000000000000000001) by Charlie#1111 at August 05, 2025 at 04:42 PM UTC\"}","type":"text"}],"tool_call_id":"functions.read_messages:6"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:7"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:8"},{"role":"assistant","content":"## Summary of Every Channel\n\nHere's a comprehensive summary of all channels across the three Discord servers:\n\n### **Fireworks AI Community** (15,420 members)\n**5 Channels:**\n\n1. **#general** - General discussion about AI and machine learning\n - Recent activity: Discussion about the new Fireworks model with positive feedback\n - 3 recent messages including team engagement\n\n2. **#announcements** - Important announcements and updates\n - No recent messages found\n\n3. **#help-support** - Get help with AI-related questions\n - Active support request about API rate limits\n - Fireworks support team actively responding to user issues\n\n4. **#voice-chat** - Voice channel (10 user limit, 64kbps)\n - No message activity (voice channel)\n\n5. **#fireworks-team** - Internal team discussions\n - No recent messages found\n\n### **AI Development Hub** (8,234 members)\n**1 Channel:**\n\n1. **#general** - General discussion\n - Only mock/test message activity detected\n\n### **Machine Learning Enthusiasts** (5,678 members)\n**1 Channel:**\n\n1. **#general** - General discussion \n - Only mock/test message activity detected\n\n### **Key Observations:**\n- **Most Active Server**: Fireworks AI Community has the most channels and active discussions\n- **Most Active Channel**: #general in Fireworks AI Community has genuine user engagement about AI models\n- **Support Activity**: #help-support shows active user support with official team responses\n- **Limited Activity**: The other two servers appear to have minimal genuine activity beyond test messages\n\nThe Fireworks AI Community server appears to be the primary hub with real user engagement, particularly around AI model discussions and technical support.","tool_calls":[]}],"input_metadata":{"row_id":"buy-major-change-thing"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T12:42:09.241914"} From 960d9a325893b1156beae0733836a74534d5fe71 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 12:56:10 -0700 Subject: [PATCH 15/54] Add Python debug configuration for Uvicorn logs server and refactor LocalFSDatasetLoggerAdapter to use current JSONL file path. Enhance read method to aggregate rows from all JSONL files in the dataset directory. --- .vscode/launch.json | 12 ++++++ .../local_fs_dataset_logger_adapter.py | 38 ++++++++++++------- eval_protocol/utils/logs_server.py | 9 ++++- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 828a253f..1d13941d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -34,6 +34,18 @@ "env": { "PYTHONPATH": "${workspaceFolder}" } + }, + { + "name": "Python: Debug Logs Server (Uvicorn)", + "type": "python", + "request": "launch", + "module": "uvicorn", + "args": ["eval_protocol.utils.logs_server:app", "--reload"], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONPATH": "${workspaceFolder}" + } } ] } diff --git a/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py b/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py index 23b46383..3cb47030 100644 --- a/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py +++ b/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py @@ -48,8 +48,8 @@ def __init__(self): os.makedirs(self.datasets_dir, exist_ok=True) # ensure that log file exists - if not os.path.exists(self.jsonl_path): - with open(self.jsonl_path, "w") as f: + if not os.path.exists(self.current_jsonl_path): + with open(self.current_jsonl_path, "w") as f: f.write("") @property @@ -58,7 +58,10 @@ def current_date(self) -> str: return datetime.now(timezone.utc).strftime("%Y-%m-%d") @property - def jsonl_path(self) -> str: + def current_jsonl_path(self) -> str: + """ + The current JSONL file path. Based on the current date. + """ return os.path.join(self.datasets_dir, f"{self.current_date}.jsonl") def log(self, row: "EvaluationRow") -> None: @@ -66,8 +69,8 @@ def log(self, row: "EvaluationRow") -> None: row_id = row.input_metadata.row_id # Check if row with this ID already exists - if os.path.exists(self.jsonl_path): - with open(self.jsonl_path, "r") as f: + if os.path.exists(self.current_jsonl_path): + with open(self.current_jsonl_path, "r") as f: lines = f.readlines() # Find the line with matching ID @@ -77,26 +80,35 @@ def log(self, row: "EvaluationRow") -> None: if line_data["input_metadata"]["row_id"] == row_id: # Update existing row lines[i] = row.model_dump_json(exclude_none=True) + os.linesep - with open(self.jsonl_path, "w") as f: + with open(self.current_jsonl_path, "w") as f: f.writelines(lines) return except json.JSONDecodeError: continue # If no existing row found, append new row - with open(self.jsonl_path, "a") as f: + with open(self.current_jsonl_path, "a") as f: f.write(row.model_dump_json(exclude_none=True) + os.linesep) def read(self, row_id: Optional[str] = None) -> List["EvaluationRow"]: - """Read rows from the JSONL file.""" - if not os.path.exists(self.jsonl_path): + """Read rows from all JSONL files in the datasets directory.""" + from eval_protocol.models import EvaluationRow + + if not os.path.exists(self.datasets_dir): return [] - data = load_jsonl(self.jsonl_path) - rows = [EvaluationRow(**r) for r in data] + all_rows = [] + for filename in os.listdir(self.datasets_dir): + if filename.endswith(".jsonl"): + file_path = os.path.join(self.datasets_dir, filename) + try: + data = load_jsonl(file_path) + all_rows.extend([EvaluationRow(**r) for r in data]) + except Exception: + continue # skip files that can't be read/parsed if row_id: # Filter by row_id if specified - return [row for row in rows if row.id == row_id] + return [row for row in all_rows if getattr(row.input_metadata, "row_id", None) == row_id] else: - return rows + return all_rows diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py index 2c586055..8017f73e 100644 --- a/eval_protocol/utils/logs_server.py +++ b/eval_protocol/utils/logs_server.py @@ -76,6 +76,13 @@ async def connect(self, websocket: WebSocket): await websocket.accept() self.active_connections.append(websocket) logger.info(f"WebSocket connected. Total connections: {len(self.active_connections)}") + logs = default_logger.read() + asyncio.run_coroutine_threadsafe( + websocket.send_text( + json.dumps({"type": "initialize_logs", "logs": [log.model_dump_json() for log in logs]}) + ), + self._loop, + ) def disconnect(self, websocket: WebSocket): if websocket in self.active_connections: @@ -143,11 +150,9 @@ def __init__( @asynccontextmanager async def lifespan(app: FastAPI): - print("before") self.start_file_watching() self.websocket_manager._loop = asyncio.get_running_loop() yield - print("after") self.stop_file_watching() super().__init__(build_dir, host, port, index_file, lifespan=lifespan) From 5155849bfcc33d823f5a6ab47a4eb11f8c525679 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 12:57:09 -0700 Subject: [PATCH 16/54] fix --- eval_protocol/utils/vite_server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eval_protocol/utils/vite_server.py b/eval_protocol/utils/vite_server.py index f5875ad4..c3df4640 100644 --- a/eval_protocol/utils/vite_server.py +++ b/eval_protocol/utils/vite_server.py @@ -1,12 +1,12 @@ -import os import logging +import os from pathlib import Path from typing import AsyncGenerator, Callable, Optional import uvicorn from fastapi import FastAPI, HTTPException -from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles logger = logging.getLogger(__name__) @@ -99,7 +99,7 @@ async def health(): """Health check endpoint.""" return {"status": "ok", "build_dir": str(self.build_dir)} - def run(self, reload: bool = False): + def run(self): """ Run the Vite server. @@ -109,4 +109,4 @@ def run(self, reload: bool = False): logger.info(f"Starting Vite server on {self.host}:{self.port}") logger.info(f"Serving files from: {self.build_dir}") - uvicorn.run(self.app, host=self.host, port=self.port, reload=reload, log_level="info") + uvicorn.run(self.app, host=self.host, port=self.port, log_level="info") From 975bc765ddded92f2285ab86272fb14f63d1529b Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 13:06:41 -0700 Subject: [PATCH 17/54] fix --- eval_protocol/pytest/default_agent_rollout_processor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eval_protocol/pytest/default_agent_rollout_processor.py b/eval_protocol/pytest/default_agent_rollout_processor.py index c7aeda5e..676347c6 100644 --- a/eval_protocol/pytest/default_agent_rollout_processor.py +++ b/eval_protocol/pytest/default_agent_rollout_processor.py @@ -8,11 +8,11 @@ from openai.types.chat import ChatCompletionContentPartTextParam, ChatCompletionMessage, ChatCompletionToolParam from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam +from eval_protocol.dataset_logger import default_logger from eval_protocol.mcp.execution.policy import LiteLLMPolicy from eval_protocol.mcp.mcp_multi_client import MCPMultiClient from eval_protocol.models import EvaluationRow, Message from eval_protocol.pytest.types import Dataset, RolloutProcessorConfig -from eval_protocol.dataset_logger import default_logger class Agent: @@ -106,7 +106,7 @@ def _get_content_from_tool_result(self, tool_result: CallToolResult) -> List[Tex return [TextContent(text=json.dumps(tool_result.structuredContent), type="text")] if not all(isinstance(content, TextContent) for content in tool_result.content): raise NotImplementedError("Non-text content is not supported yet") - return tool_result.content[0].text + return tool_result.content async def default_agent_rollout_processor( From ee56fc77068780eb39b1f7c6a8f91221eb5cf91c Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 13:06:44 -0700 Subject: [PATCH 18/54] save --- .eval_protocol/datasets/2025-08-05.jsonl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl index 15edecf9..3dbdc3c3 100644 --- a/.eval_protocol/datasets/2025-08-05.jsonl +++ b/.eval_protocol/datasets/2025-08-05.jsonl @@ -5,3 +5,7 @@ {"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll retrieve their channels and recent messages.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"contain-current-brave-community"},"created_at":"2025-08-05T12:37:12.408698"} {"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"win-slow-office-student"},"created_at":"2025-08-05T12:40:45.354325"} {"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","function":{"arguments":"{}","name":"list_servers"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Available Servers (3):\\nFireworks AI Community (ID: 1234567890123456789, Members: 15420)\\nAI Development Hub (ID: 9876543210987654321, Members: 8234)\\nMachine Learning Enthusiasts (ID: 5556667778889990001, Members: 5678)\"}","type":"text"}],"tool_call_id":"functions.list_servers:0"},{"role":"assistant","content":"Now let me get the channels for each server:","tool_calls":[{"id":"functions.get_channels:1","function":{"arguments":"{\"server_id\": \"1234567890123456789\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:2","function":{"arguments":"{\"server_id\": \"9876543210987654321\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:3","function":{"arguments":"{\"server_id\": \"5556667778889990001\"}","name":"get_channels"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"server_name\": \"Fireworks AI Community\", \"server_id\": \"1234567890123456789\", \"channels\": {\"1111111111111111111\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion about AI and machine learning\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"2222222222222222222\": {\"name\": \"announcements\", \"type\": \"text\", \"position\": 1, \"archived\": false, \"category_id\": null, \"topic\": \"Important announcements and updates\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"3333333333333333333\": {\"name\": \"help-support\", \"type\": \"text\", \"position\": 2, \"archived\": false, \"category_id\": null, \"topic\": \"Get help with AI-related questions\", \"nsfw\": false, \"slowmode_delay\": 5, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"4444444444444444444\": {\"name\": \"voice-chat\", \"type\": \"voice\", \"position\": 3, \"archived\": false, \"category_id\": null, \"topic\": null, \"nsfw\": null, \"slowmode_delay\": null, \"user_limit\": 10, \"bitrate\": 64000, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"5555555555555555555\": {\"name\": \"fireworks-team\", \"type\": \"text\", \"position\": 4, \"archived\": false, \"category_id\": null, \"topic\": \"Internal team discussions\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}}, \"total_channels\": 5}","type":"text"}],"tool_call_id":"functions.get_channels:1"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"9876543210987654321\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:2"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"5556667778889990001\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:3"},{"role":"assistant","content":"Now let me read recent messages from each text channel. I'll use a recent timestamp to get the latest messages:","tool_calls":[{"id":"functions.read_messages:4","function":{"arguments":"{\"channel_id\": \"1111111111111111111\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:5","function":{"arguments":"{\"channel_id\": \"2222222222222222222\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:6","function":{"arguments":"{\"channel_id\": \"3333333333333333333\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:7","function":{"arguments":"{\"channel_id\": \"5555555555555555555\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:8","function":{"arguments":"{\"channel_id\": \"9999999999999999999\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 3 messages after December 19, 2024 at 12:00 AM UTC in general:\\n\\n Message 1 (id: 1000000000000000001):\\n Author: Alice#1234\\n Timestamp: August 05, 2025 at 05:42 PM UTC\\n Content: Has anyone tried the new Fireworks model? It's amazing!\\n Reactions: \\ud83d\\udc4d(5), \\ud83d\\udd25(3)\\n Message 2 (id: 1000000000000000002):\\n Author: Bob#5678\\n Timestamp: August 05, 2025 at 06:12 PM UTC\\n Content: Yes! The performance is incredible. What are you using it for?\\n Reactions: \\ud83d\\udc4d(2)\\n Reply to: message(id=1000000000000000001) by Alice#1234 at August 05, 2025 at 05:42 PM UTC\\n Message 3 (id: 1000000000000000003):\\n Author: Fireworks Team#9999 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 06:42 PM UTC\\n Content: We're glad you're enjoying it! Let us know if you have any questions.\\n Reactions: \\u2764\\ufe0f(8)\"}","type":"text"}],"tool_call_id":"functions.read_messages:4"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:5"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 2 messages after December 19, 2024 at 12:00 AM UTC in help-support:\\n\\n Message 1 (id: 2000000000000000001):\\n Author: Charlie#1111\\n Timestamp: August 05, 2025 at 04:42 PM UTC\\n Content: I'm having trouble with the API rate limits. Can someone help?\\n Message 2 (id: 2000000000000000002):\\n Author: Fireworks Support#8888 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 04:57 PM UTC\\n Content: Hi Charlie! Can you share your current usage and the specific error you're seeing?\\n Reactions: \\u2705(1)\\n Reply to: message(id=2000000000000000001) by Charlie#1111 at August 05, 2025 at 04:42 PM UTC\"}","type":"text"}],"tool_call_id":"functions.read_messages:6"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:7"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:8"},{"role":"assistant","content":"## Summary of Every Channel\n\nHere's a comprehensive summary of all channels across the three Discord servers:\n\n### **Fireworks AI Community** (15,420 members)\n**5 Channels:**\n\n1. **#general** - General discussion about AI and machine learning\n - Recent activity: Discussion about the new Fireworks model with positive feedback\n - 3 recent messages including team engagement\n\n2. **#announcements** - Important announcements and updates\n - No recent messages found\n\n3. **#help-support** - Get help with AI-related questions\n - Active support request about API rate limits\n - Fireworks support team actively responding to user issues\n\n4. **#voice-chat** - Voice channel (10 user limit, 64kbps)\n - No message activity (voice channel)\n\n5. **#fireworks-team** - Internal team discussions\n - No recent messages found\n\n### **AI Development Hub** (8,234 members)\n**1 Channel:**\n\n1. **#general** - General discussion\n - Only mock/test message activity detected\n\n### **Machine Learning Enthusiasts** (5,678 members)\n**1 Channel:**\n\n1. **#general** - General discussion \n - Only mock/test message activity detected\n\n### **Key Observations:**\n- **Most Active Server**: Fireworks AI Community has the most channels and active discussions\n- **Most Active Channel**: #general in Fireworks AI Community has genuine user engagement about AI models\n- **Support Activity**: #help-support shows active user support with official team responses\n- **Limited Activity**: The other two servers appear to have minimal genuine activity beyond test messages\n\nThe Fireworks AI Community server appears to be the primary hub with real user engagement, particularly around AI model discussions and technical support.","tool_calls":[]}],"input_metadata":{"row_id":"buy-major-change-thing"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T12:42:09.241914"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]}],"input_metadata":{"row_id":"achieve-poor-art-teacher"},"created_at":"2025-08-05T12:58:20.118600"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]}],"input_metadata":{"row_id":"report-serve-significant-head"},"created_at":"2025-08-05T13:04:02.839130"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks AI. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"manage deployments Fireworks AI deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","type":"text"},{"text":"Title: How do I close my Fireworks.ai account?\nLink: https://docs.fireworks.ai/faq-new/account-access/how-do-i-close-my-fireworksai-account\nContent: To close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nHow do I close my Fireworks.ai account?\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\n","type":"text"},{"text":"Title: I have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nLink: https://docs.fireworks.ai/faq-new/account-access/i-have-multiple-fireworks-accounts-when-i-try-to-login-with-google-on-fireworks\nContent: If you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nI have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\n","type":"text"},{"text":"Title: Introduction\nLink: https://docs.fireworks.ai/api-reference/introduction\nContent: Fireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nIntroduction\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\n","type":"text"},{"text":"Title: Do you host your deployments in the EU or Asia?\nLink: https://docs.fireworks.ai/faq-new/support-general/do-you-host-your-deployments-in-the-eu-or-asia\nContent: We are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nDo you host your deployments in the EU or Asia?\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\n","type":"text"},{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: On-demand deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: If you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\n","type":"text"},{"text":"Title: How much does Fireworks cost?\nLink: https://docs.fireworks.ai/faq-new/billing-pricing/how-much-does-fireworks-cost\nContent: Fireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nHow much does Fireworks cost?\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\n","type":"text"},{"text":"Title: Migration and traffic management\nLink: https://docs.fireworks.ai/guides/prompt-caching\nContent: When migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\nWhen migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\nWhen migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Create a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management, including creating, updating, and managing deployments.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deployment management API create update delete list deployments\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Delete API Key\nLink: https://docs.fireworks.ai/api-reference/delete-api-key\nContent: \n\n\n\nREST Endpoint POST /v1/accounts/{account_id}/apiKeys:delete\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"keyId\":\"\"}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: Managing default deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: Since a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\nSince a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\nSince a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\n","type":"text"},{"text":"Title: List Deployments\nLink: https://docs.fireworks.ai/api-reference/list-deployments\nContent: REST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\nREST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\n\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Creates a new deployment.\n\nCreates a new deployment.\n\nCreates a new deployment.\n\n","type":"text"},{"text":"Title: Deleting Stored Responses\nLink: https://docs.fireworks.ai/guides/response-api\nContent: When responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\nWhen responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\nWhen responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\n","type":"text"},{"text":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","type":"text"},{"text":"Title: Delete a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/delete-resources\nContent: Deletes an model deployment.\n\nDeletes an model deployment.\n\nDeletes an model deployment.\n\n","type":"text"},{"text":"Title: delete_deployment(ignore_checks: bool = False, wait: bool = True)\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-reference\nContent: Deletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\nDeletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\nDeletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\n","type":"text"}],"tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more information about the Fireworks Build SDK and practical deployment management examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks Build SDK deployment management Python examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: Basics of the Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-basics\nContent: Why use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nWhy use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nWhy use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: 🔧 Build SDK: Deployment Configuration Application Requirement\nLink: https://docs.fireworks.ai/updates/changelog\nContent: The Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\nThe Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\nThe Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\n","type":"text"},{"text":"Title: Example with Fireworks Build SDK\nLink: https://docs.fireworks.ai/faq-new/models-inference/how-to-get-performance-metrics-for-streaming-responses\nContent: from fireworks import LLM\nimport os\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\",\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n)\n\n# Streaming completion with performance metrics\nstream = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}],\n max_tokens=100,\n stream=True,\n perf_metrics_in_response=True,\n)\n\nfor chunk in stream:\n # Use getattr to avoid linter errors for unknown attributes\n perf_metrics = getattr(chunk, \"perf_metrics\", None)\n finish_reason = getattr(chunk.choices[0], \"finish_reason\", None)\n if perf_metrics is not None and finish_reason:\n print(\"Performance metrics:\", perf_metrics)\n\nfrom fireworks import LLM\nimport os\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\",\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n)\n\n# Streaming completion with performance metrics\nstream = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}],\n max_tokens=100,\n stream=True,\n perf_metrics_in_response=True,\n)\n\nfor chunk in stream:\n # Use getattr to avoid linter errors for unknown attributes\n perf_metrics = getattr(chunk, \"perf_metrics\", None)\n finish_reason = getattr(chunk.choices[0], \"finish_reason\", None)\n if perf_metrics is not None and finish_reason:\n print(\"Performance metrics:\", perf_metrics)\n\nExample with cURL\ncurl -X POST \"https://api.fireworks.ai/inference/v1/completions\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"prompt\": \"The quick brown fox\",\n \"max_tokens\": 100,\n \"stream\": true,\n \"perf_metrics_in_response\": true\n }'\n\n","type":"text"},{"text":"Title: Set up your developer environment & call the Fireworks API\nLink: https://docs.fireworks.ai/getting-started/quickstart\nContent: This is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\nThis is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\nThis is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\n","type":"text"},{"text":"Title: Step 1: Configure the Fireworks Build SDK\nLink: https://docs.fireworks.ai/structured-responses/structured-output-grammar-based\nContent: from fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\nfrom fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\nfrom fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\n","type":"text"},{"text":"Title: Deployment with the Build SDK\nLink: https://docs.fireworks.ai/fine-tuning/single-lora\nContent: You can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\nYou can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\nYou can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\n","type":"text"},{"text":"Title: Foreword\nLink: https://docs.fireworks.ai/tools-sdks/python-client/the-tutorial\nContent: This tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\nThis tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\nThis tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\n","type":"text"},{"text":"Title: Code example: Optimal concurrent requests (Python)\nLink: https://docs.fireworks.ai/deployments/client-side-performance-optimization\nContent: Here's how to implement optimal concurrent requests using asyncio and the LLM class: import asyncio\nfrom fireworks import LLM\n\nasync def make_concurrent_requests(\n messages: list[str],\n max_workers: int = 1000,\n max_connections: int = 1000, # this is the default value in the SDK\n):\n \"\"\"Make concurrent requests with optimized connection pooling\"\"\"\n \n llm = LLM(\n model=\"your-model-name\",\n deployment_type=\"on-demand\", \n id=\"your-deployment-id\",\n max_connections=max_connections\n )\n \n # Apply deployment configuration to Fireworks\n llm.apply()\n \n # Semaphore to limit concurrent requests\n semaphore = asyncio.Semaphore(max_workers)\n \n async def single_request(message: str):\n \"\"\"Make a single request with semaphore control\"\"\"\n async with semaphore:\n response = await llm.chat.completions.acreate(\n messages=[{\"role\": \"user\", \"content\": message}],\n max_tokens=100\n )\n return response.choices[0].message.content\n \n # Create all request tasks\n tasks = [\n single_request(message) \n for message in messages\n ]\n \n # Execute all requests concurrently\n results = await asyncio.gather(*tasks)\n return results\n\n# Usage example\nasync def main():\n messages = [\"Hello!\"] * 1000 # 1000 requests\n \n results = await make_concurrent_requests(\n messages=messages,\n )\n \n print(f\"Completed {len(results)} requests\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n\nHere's how to implement optimal concurrent requests using asyncio and the LLM class: import asyncio\nfrom fireworks import LLM\n\nasync def make_concurrent_requests(\n messages: list[str],\n max_workers: int = 1000,\n max_connections: int = 1000, # this is the default value in the SDK\n):\n \"\"\"Make concurrent requests with optimized connection pooling\"\"\"\n \n llm = LLM(\n model=\"your-model-name\",\n deployment_type=\"on-demand\", \n id=\"your-deployment-id\",\n max_connections=max_connections\n )\n \n # Apply deployment configuration to Fireworks\n llm.apply()\n \n # Semaphore to limit concurrent requests\n semaphore = asyncio.Semaphore(max_workers)\n \n async def single_request(message: str):\n \"\"\"Make a single request with semaphore control\"\"\"\n async with semaphore:\n response = await llm.chat.completions.acreate(\n messages=[{\"role\": \"user\", \"content\": message}],\n max_tokens=100\n )\n return response.choices[0].message.content\n \n # Create all request tasks\n tasks = [\n single_request(message) \n for message in messages\n ]\n \n # Execute all requests concurrently\n results = await asyncio.gather(*tasks)\n return results\n\n# Usage example\nasync def main():\n messages = [\"Hello!\"] * 1000 # 1000 requests\n \n results = await make_concurrent_requests(\n messages=messages,\n )\n \n print(f\"Completed {len(results)} requests\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n\nClient-side performance optimization\nWhen using a dedicated deployment, it is important to optimize the client-side\nHTTP connection pooling for maximum performance. We recommend using our Python\nSDK as it has good defaults for\nconnection pooling and utilizes\naiohttp for optimal performance\nwith Python's asyncio library. It also includes retry logic for handling 429 errors that Fireworks returns when the server is overloaded. We have run\nbenchmarks that demonstrate the performance benefits.\n\n","type":"text"},{"text":"Title: Storing Responses\nLink: https://docs.fireworks.ai/guides/response-api\nContent: By default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\nBy default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\nBy default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, I'll provide you with a comprehensive guide on managing deployments on Fireworks AI. Let me break this down into practical sections with code examples.\n\n## Overview of Deployment Management on Fireworks AI\n\nFireworks AI offers several ways to manage deployments:\n\n1. **Fireworks Build SDK (Python)** - Recommended approach\n2. **REST API** - Direct HTTP API calls\n3. **Web Dashboard** - GUI-based management\n4. **CLI Tools** - Command-line interface\n\n## 1. Using the Fireworks Build SDK (Recommended)\n\nThe Fireworks Build SDK provides the most intuitive way to manage deployments programmatically.\n\n### Installation\n```bash\npip install fireworks-ai\n```\n\n### Basic Deployment Management\n\n#### Creating Deployments\n```python\nfrom fireworks import LLM\nimport os\n\n# Set your API key\nos.environ[\"FIREWORKS_API_KEY\"] = \"your-api-key\"\n\n# Create an on-demand deployment\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"my-llama-deployment\",\n min_replica_count=1,\n max_replica_count=4,\n accelerator_type=\"A100-80GB-SXM\",\n accelerator_count=1\n)\n\n# Apply the deployment (required for on-demand deployments)\nllm.apply()\n\nprint(f\"Deployment created! Track at: {llm.deployment_url}\")\n```\n\n#### Serverless Deployments (Automatic)\n```python\n# Serverless deployments don't require explicit management\nllm_serverless = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\"\n)\n\n# Use immediately - no deployment management needed\nresponse = llm_serverless.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### Managing Fine-tuned Model Deployments\n```python\n# Deploy a fine-tuned LoRA model\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand-lora\",\n id=\"my-fine-tuned-deployment\"\n)\n\n# Apply the deployment\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### Deleting Deployments\n```python\n# Delete deployment associated with LLM instance\nllm.delete_deployment(ignore_checks=True, wait=True)\n\n# Or delete by deployment ID\nfrom fireworks.resources.deployments import Deployment\n\ndeployment = Deployment.get(\"deployment-id-to-delete\")\ndeployment.delete(ignore_checks=True)\n```\n\n### Advanced Deployment Configuration\n\n```python\nfrom fireworks import LLM\n\n# Advanced deployment with custom configuration\nllm = LLM(\n model=\"llama-v3p1-70b-instruct\",\n deployment_type=\"on-demand\",\n id=\"production-llama-70b\",\n \n # Scaling configuration\n min_replica_count=2,\n max_replica_count=10,\n autoscaling_policy={\n \"scale_up_window\": \"60s\",\n \"scale_down_window\": \"300s\",\n \"scale_to_zero_window\": \"600s\"\n },\n \n # Hardware configuration\n accelerator_type=\"H100-80GB-SXM\",\n accelerator_count=2,\n precision=\"float16\",\n \n # Placement configuration\n placement={\n \"regions\": [\"us-east-1\", \"us-west-2\"],\n \"multi_region\": \"MULTI_REGION_UNSPECIFIED\"\n },\n \n # Additional features\n enable_addons=True,\n draft_model=\"llama-v3p1-8b-instruct\",\n draft_token_count=8\n)\n\n# Apply configuration\nllm.apply()\n```\n\n## 2. Using the REST API\n\n### List All Deployments\n```python\nimport requests\nimport os\n\naccount_id = \"your-account-id\"\napi_key = os.environ[\"FIREWORKS_API_KEY\"]\n\nheaders = {\n \"Authorization\": f\"Bearer {api_key}\",\n \"x-fireworks-account-id\": account_id\n}\n\n# List deployments\nresponse = requests.get(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\",\n headers=headers\n)\n\ndeployments = response.json()\nfor deployment in deployments.get(\"deployments\", []):\n print(f\"Deployment: {deployment['displayName']} - Status: {deployment['state']}\")\n```\n\n### Create Deployment via API\n```python\nimport requests\nimport json\n\ndeployment_config = {\n \"displayName\": \"my-new-deployment\",\n \"description\": \"Production deployment for customer service\",\n \"baseModel\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"acceleratorType\": \"A100-80GB-SXM\",\n \"acceleratorCount\": 1,\n \"minReplicaCount\": 1,\n \"maxReplicaCount\": 5,\n \"autoscalingPolicy\": {\n \"scaleUpWindow\": \"60s\",\n \"scaleDownWindow\": \"300s\",\n \"scaleToZeroWindow\": \"600s\"\n }\n}\n\nresponse = requests.post(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\",\n headers=headers,\n json=deployment_config\n)\n\nprint(f\"Deployment created: {response.json()}\")\n```\n\n### Update Deployment\n```python\nupdate_config = {\n \"maxReplicaCount\": 10,\n \"description\": \"Updated production deployment with higher capacity\"\n}\n\nresponse = requests.patch(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\",\n headers=headers,\n json=update_config\n)\n```\n\n### Delete Deployment\n```python\nresponse = requests.delete(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\",\n headers=headers,\n params={\"hard\": True, \"ignoreChecks\": True}\n)\n```\n\n## 3. Managing Default Deployments\n\nWhen you have multiple deployments of the same model, Fireworks uses a \"default\" deployment for routing:\n\n```python\n# Check which deployment is default\nfrom fireworks.resources.deployments import Deployment\n\ndeployments = Deployment.list(\n filter='baseModel=\"accounts/fireworks/models/llama-v3p1-8b-instruct\"'\n)\n\nfor deployment in deployments:\n print(f\"Deployment: {deployment.display_name}, Default: {deployment.is_default}\")\n\n# Update default deployment\ndeployment = Deployment.get(\"deployment-id-to-make-default\")\ndeployment.make_default()\n```\n\n## 4. Cost Management and Best Practices\n\n### Monitoring Deployment Costs\n```python\n# Check deployment status and costs\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"cost-optimized-deployment\"\n)\n\n# Enable scale-to-zero to minimize costs\nllm.update_deployment(\n min_replica_count=0,\n autoscaling_policy={\n \"scale_to_zero_window\": \"300s\"\n }\n)\n```\n\n### Automated Cleanup Script\n```python\nimport asyncio\nfrom datetime import datetime, timedelta\nfrom fireworks.resources.deployments import Deployment\n\nasync def cleanup_unused_deployments():\n \"\"\"Clean up deployments that haven't been used for 24 hours\"\"\"\n \n deployments = Deployment.list()\n \n for deployment in deployments:\n # Check last usage\n last_used = deployment.last_used_time\n if last_used and datetime.now() - last_used > timedelta(hours=24):\n print(f\"Deleting unused deployment: {deployment.display_name}\")\n deployment.delete()\n\n# Run cleanup\nasyncio.run(cleanup_unused_deployments())\n```\n\n## 5. Traffic Management and Migration\n\nWhen migrating between deployments, use consistent routing:\n\n```python\nimport hashlib\n\ndef route_to_deployment(user_id, traffic_fraction=0.2):\n \"\"\"Consistent routing for deployment migration\"\"\"\n \n hashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16)\n max_hash = 2**128 - 1\n ratio = hashed_user_id / max_hash\n \n if ratio < traffic_fraction:\n return \"new-deployment-id\"\n else:\n return \"old-deployment-id\"\n\n# Usage\nuser_id = \"user-123\"\ndeployment_id = route_to_deployment(user_id, 0.2)\n```\n\n## 6. Monitoring and Debugging\n\n### Check Deployment Status\n```python\nfrom fireworks import LLM\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"my-deployment\"\n)\n\n# Get deployment status\nstatus = llm.get_deployment_status()\nprint(f\"Status: {status.state}\")\nprint(f\"Replicas: {status.replica_count}\")\nprint(f\"URL: {llm.deployment_url}\")\n```\n\n### Performance Monitoring\n```python\n# Enable performance metrics\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}],\n perf_metrics_in_response=True\n)\n\nif hasattr(response, 'perf_metrics'):\n print(\"Performance metrics:\", response.perf_metrics)\n```\n\n## Key Takeaways\n\n1. **Use the Build SDK** for the best development experience\n2. **Serverless deployments** are easiest - no management needed\n3. **On-demand deployments** require `.apply()` calls and manual cleanup\n4. **Monitor costs** - on-demand deployments bill by GPU-second even when idle\n5. **Use scale-to-zero** to minimize costs during low usage\n6. **Track deployments** using the web dashboard at https://app.fireworks.ai/dashboard/deployments\n\nThis comprehensive approach covers all aspects of deployment management on Fireworks AI, from basic creation to advanced monitoring and cost optimization.","tool_calls":[]}],"input_metadata":{"row_id":"experiment-safe-anger-lot"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T13:05:03.474251"} +{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"manage deployments Fireworks AI deployment lifecycle\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","type":"text"},{"text":"Title: How do I close my Fireworks.ai account?\nLink: https://docs.fireworks.ai/faq-new/account-access/how-do-i-close-my-fireworksai-account\nContent: To close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nHow do I close my Fireworks.ai account?\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\n","type":"text"},{"text":"Title: Do you host your deployments in the EU or Asia?\nLink: https://docs.fireworks.ai/faq-new/support-general/do-you-host-your-deployments-in-the-eu-or-asia\nContent: We are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nDo you host your deployments in the EU or Asia?\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\n","type":"text"},{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: On-demand deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: If you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\n","type":"text"},{"text":"Title: I have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nLink: https://docs.fireworks.ai/faq-new/account-access/i-have-multiple-fireworks-accounts-when-i-try-to-login-with-google-on-fireworks\nContent: If you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nI have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\n","type":"text"},{"text":"Title: How much does Fireworks cost?\nLink: https://docs.fireworks.ai/faq-new/billing-pricing/how-much-does-fireworks-cost\nContent: Fireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nHow much does Fireworks cost?\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\n","type":"text"},{"text":"Title: Introduction\nLink: https://docs.fireworks.ai/api-reference/introduction\nContent: Fireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nIntroduction\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\n","type":"text"},{"text":"Title: Control plane and data plane\nLink: https://docs.fireworks.ai/getting-started/concepts\nContent: The Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\nThe Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\nThe Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Create a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and workflows.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deployment management commands firectl CLI create update delete scale deployments\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","type":"text"},{"text":"Title: Creating an on-demand deployment\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: Choose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\nChoose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\nChoose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Creates a new deployment. firectl create deployment [flags]\n\nCreates a new deployment. firectl create deployment [flags]\n\nCreates a new deployment. firectl create deployment [flags]\n\n","type":"text"},{"text":"Title: Delete a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/delete-resources\nContent: Deletes an model deployment. firectl delete deployment [flags]\n\nDeletes an model deployment. firectl delete deployment [flags]\n\nDeletes an model deployment. firectl delete deployment [flags]\n\n","type":"text"},{"text":"Title: Cli overview\nLink: https://docs.fireworks.ai/evaluators/cli_reference/cli_overview\nContent: Command Line Interface Reference\nThe Reward Kit provides a command-line interface (CLI) for common operations like previewing evaluations, deploying reward functions, and running agent evaluations.\n\nCommand Line Interface Reference\nThe Reward Kit provides a command-line interface (CLI) for common operations like previewing evaluations, deploying reward functions, and running agent evaluations.\n\nCommand Overview\nThe Reward Kit CLI supports the following main commands: run : Run a local evaluation pipeline using a Hydra configuration. preview : Preview evaluation results or re-evaluate generated outputs. deploy : Deploy a reward function as an evaluator. agent-eval : Run agent evaluations on task bundles. list : List existing evaluators (coming soon). delete : Delete an evaluator (coming soon).\n\n","type":"text"},{"text":"Title: Deployment Command\nLink: https://docs.fireworks.ai/evaluators/examples/gcp_cloud_run_deployment_example\nContent: It's recommended to run the deployment command from the directory containing the reward function script ( dummy_rewards.py ) and your rewardkit.yaml (if used), for example, from examples/gcp_cloud_run_deployment_example/. Ensure your virtual environment is active: Run the deployment command: Command Explanation: --id my-dummy-gcp-evaluator : A unique ID for your evaluator on the Fireworks AI platform. --target gcp-cloud-run : Specifies deployment to GCP Cloud Run. --function-ref dummy_rewards.hello_world_reward : The Python import path to your reward function. If dummy_rewards.py is in the current directory, this reference works. --gcp-auth-mode api-key : Configures the Cloud Run service with API key authentication. reward-kit will generate a key, store it in GCP Secret Manager, and configure the service. The key is also saved to your local rewardkit.yaml under evaluator_endpoint_keys . This is the default if not specified. --verbose : Shows detailed output, including gcloud commands being executed. --force : (Optional) If an evaluator with the same --id already exists, this flag will delete the existing one before creating the new one.\n\nIt's recommended to run the deployment command from the directory containing the reward function script ( dummy_rewards.py ) and your rewardkit.yaml (if used), for example, from examples/gcp_cloud_run_deployment_example/. Ensure your virtual environment is active: Run the deployment command: Command Explanation: --id my-dummy-gcp-evaluator : A unique ID for your evaluator on the Fireworks AI platform. --target gcp-cloud-run : Specifies deployment to GCP Cloud Run. --function-ref dummy_rewards.hello_world_reward : The Python import path to your reward function. If dummy_rewards.py is in the current directory, this reference works. --gcp-auth-mode api-key : Configures the Cloud Run service with API key authentication. reward-kit will generate a key, store it in GCP Secret Manager, and configure the service. The key is also saved to your local rewardkit.yaml under evaluator_endpoint_keys . This is the default if not specified. --verbose : Shows detailed output, including gcloud commands being executed. --force : (Optional) If an evaluator with the same --id already exists, this flag will delete the existing one before creating the new one.\n\nrewardkit.yaml Configuration (Optional but Recommended)\nThe reward-kit CLI can pick up GCP settings from a rewardkit.yaml file located in the directory from which you run the reward-kit deploy command. Create rewardkit.yaml :\nYou can copy the examples/gcp_cloud_run_deployment_example/rewardkit.example.yaml to the directory where you intend to run reward-kit deploy (this could be the example directory itself, or your project root). Rename it to rewardkit.yaml. Customize rewardkit.yaml :\nOpen rewardkit.yaml and replace placeholders with your actual GCP Project ID and desired region.\nExample rewardkit.yaml: Note : If you choose not to use a rewardkit.yaml file, you must provide all necessary GCP parameters (like --gcp-project YOUR_PROJECT_ID , --gcp-region YOUR_REGION ) directly in the reward-kit deploy command.\n\n","type":"text"},{"text":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: 🚀 Easier & faster LoRA fine-tune deployments on Fireworks\nLink: https://docs.fireworks.ai/updates/changelog\nContent: You can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\nYou can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\nYou can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: Deploying a fine-tuned model using an on-demand deployment\nLink: https://docs.fireworks.ai/fine-tuning/fine-tuning-models\nContent: Use the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\nUse the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\nUse the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\n","type":"text"}],"tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more information about listing, scaling, and managing deployments.","tool_calls":[{"id":"functions.search:2","function":{"arguments":"{\"query\": \"list deployments scale deployment update deployment configuration autoscaling\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: How does billing work for on-demand deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-work-for-on-demand-deployments\nContent: On-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\nOn-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\nHow does billing work for on-demand deployments?\nOn-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: How does autoscaling affect my costs?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-autoscaling-affect-my-costs\nContent: Scaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\nScaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\nHow does autoscaling affect my costs?\nScaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\n","type":"text"},{"text":"Title: Customizing autoscaling behavior\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: You can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\nYou can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\nYou can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\n","type":"text"},{"text":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","type":"text"},{"text":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","type":"text"},{"text":"Title: Do you support Auto Scaling?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/do-you-support-auto-scaling\nContent: Yes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\nYes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\nDo you support Auto Scaling?\nYes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\n","type":"text"},{"text":"Title: List Deployments\nLink: https://docs.fireworks.ai/api-reference/list-deployments\nContent: \n\n\n\nREST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\n","type":"text"},{"text":"Title: Deployment type selection\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-basics\nContent: The SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\nThe SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\nThe SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\n","type":"text"},{"text":"Title: 2. Call a language model using the LLM() class\nLink: https://docs.fireworks.ai/tools-sdks/python-client/the-tutorial\nContent: Now that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. The great thing about the SDK is that you can use your favorite Python constructs to powerfully work with LLMs. For example, let's try calling a few LLMs in a loop and see how they respond: from fireworks import LLM\n\nllms = [\n \"llama4-maverick-instruct-basic\",\n \"deepseek-r1\",\n \"qwen2p5-vl-32b-instruct\"\n]\n\nfor llm in llms:\n llm = LLM(model=llm, deployment_type=\"auto\") \n print(\"\\n\" + \"-\" * 100)\n print(f\"Model: {llm.model}\")\n print(\"-\" * 100 + \"\\n\")\n\n response = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}]\n )\n print(response.choices[0].message.content)\n\nNow that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. from fireworks import LLM\n\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\") \n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}]\n)\n\nprint(response.choices[0].message.content)\n\nNow that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?\n\n","type":"text"}],"tool_call_id":"functions.search:2"},{"role":"assistant","content":"Based on my research, here's a comprehensive guide to managing deployments on Fireworks AI:\n\n## Understanding Fireworks AI Deployments\n\nFireworks AI offers **two types of deployments**:\n\n1. **Serverless deployments** - Pay-per-token, rate-limited, fully managed\n2. **On-demand deployments** - Pay-per-GPU-second, dedicated resources, more control\n\n## Managing Deployments with firectl CLI\n\n### 1. Creating Deployments\n\n**Basic deployment creation:**\n```bash\n# Create a deployment from model library\nfirectl create deployment --wait\n\n# Create deployment for custom model\nfirectl create deployment accounts//models/ --wait\n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 1 \\\n --max-replica-count 4 \\\n --scale-to-zero-window 30m\n```\n\n**Deploy fine-tuned models:**\n```bash\n# Deploy a LoRA fine-tuned model\nfirectl create deployment \n```\n\n### 2. Listing and Monitoring Deployments\n\n```bash\n# List all deployments\nfirectl list deployments\n\n# Get deployment details\nfirectl get deployment \n\n# Check deployment status (should show \"READY\")\nfirectl get deployment -o json | jq '.state'\n```\n\n### 3. Scaling and Autoscaling Configuration\n\n**Custom autoscaling behavior:**\n```bash\nfirectl create deployment \\\n --scale-up-window 60s \\\n --scale-down-window 15m \\\n --scale-to-zero-window 2h \\\n --load-targets default=0.7,tokens_generated_per_second=100\n```\n\n**Manual scaling:**\n```bash\n# Update deployment configuration\nfirectl update deployment \\\n --min-replica-count 2 \\\n --max-replica-count 8\n```\n\n### 4. Deleting Deployments\n\n```bash\n# Delete a specific deployment\nfirectl delete deployment \n\n# Force delete (ignores usage checks)\nfirectl delete deployment --ignore-checks\n```\n\n## Managing Deployments via REST API\n\n### List deployments:\n```bash\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\" \\\n -H \"Authorization: Bearer {API_KEY}\"\n```\n\n### Update deployment:\n```bash\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer {API_KEY}\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 2,\n \"maxReplicaCount\": 6,\n \"autoscalingPolicy\": {\n \"scaleToZeroWindow\": \"30m\",\n \"loadTargets\": {\"default\": 0.8}\n }\n }'\n```\n\n### Delete deployment:\n```bash\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer {API_KEY}\"\n```\n\n## Managing Deployments with Python SDK\n\n```python\nfrom fireworks import LLM\n\n# Auto-select deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\n# Explicit on-demand deployment\nllm = LLM(\n model=\"llama4-maverick-instruct-basic\", \n deployment_type=\"on-demand\",\n id=\"my-unique-deployment-id\"\n)\nllm.apply() # Required for on-demand deployments\n\n# Serverless deployment (no apply needed)\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"serverless\")\n```\n\n## Cost Management Best Practices\n\n### Autoscaling Configuration:\n- **Default behavior**: Scales to 0 after 1 hour of inactivity\n- **Custom scale-to-zero**: Set `--scale-to-zero-window` from 5m to customize\n- **Cost optimization**: Use autoscaling to 0 for intermittent workloads\n\n### Monitoring Costs:\n```bash\n# Check active deployments regularly\nfirectl list deployments\n\n# Monitor GPU usage and costs\n# Deployments auto-delete after 7 days of no traffic\n```\n\n### Reserved Capacity:\nFor high-volume usage, consider **reserved capacity** instead of on-demand:\n- More reliable capacity\n- Higher GPU quotas\n- Better pricing for consistent workloads\n\n## Key Management Commands Summary\n\n| Operation | Command |\n|-----------|---------|\n| **Create** | `firectl create deployment ` |\n| **List** | `firectl list deployments` |\n| **Get** | `firectl get deployment ` |\n| **Update** | `firectl update deployment ` |\n| **Delete** | `firectl delete deployment ` |\n| **Scale** | Use `--min-replica-count` and `--max-replica-count` flags |\n\n## Important Notes\n\n- **Automatic cleanup**: Deployments auto-scale to 0 after 1h inactivity, auto-delete after 7 days\n- **Cold start**: Expect 1-3 minutes when scaling from 0 to 1 replicas\n- **Billing**: Starts when server accepts requests, continues while replicas are active\n- **Rate limits**: On-demand deployments have no hard rate limits (within GPU capacity)\n\nThis comprehensive guide covers all aspects of deployment management on Fireworks AI. Start with simple commands and gradually explore advanced configuration options as your needs grow!","tool_calls":[]}],"input_metadata":{"row_id":"wait-warm-people-child"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T13:05:54.247652"} From 011834a74c8ae34bcdbb55859fc74640ba659b1e Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:28:47 -0700 Subject: [PATCH 19/54] remove unnecessary test --- tests/test_dataset_logger_signal_handling.py | 148 ------------------- 1 file changed, 148 deletions(-) delete mode 100644 tests/test_dataset_logger_signal_handling.py diff --git a/tests/test_dataset_logger_signal_handling.py b/tests/test_dataset_logger_signal_handling.py deleted file mode 100644 index 105f6817..00000000 --- a/tests/test_dataset_logger_signal_handling.py +++ /dev/null @@ -1,148 +0,0 @@ -import os -import signal -import tempfile -import time -import json -from unittest.mock import patch -import pytest - -from eval_protocol.dataset_logger.local_fs_dataset_logger_adapter import LocalFSDatasetLoggerAdapter -from eval_protocol.models import EvaluationRow - - -class TestLocalFSDatasetLoggerAdapterSignalHandling: - """Test that the dataset logger properly handles termination signals.""" - - def setup_method(self): - """Set up a temporary directory for testing.""" - self.temp_dir = tempfile.mkdtemp() - self.original_cwd = os.getcwd() - os.chdir(self.temp_dir) - - # Create a mock .eval_protocol directory - os.makedirs(".eval_protocol/datasets", exist_ok=True) - - def teardown_method(self): - """Clean up after tests.""" - os.chdir(self.original_cwd) - import shutil - shutil.rmtree(self.temp_dir, ignore_errors=True) - - def test_signal_handlers_registered(self): - """Test that signal handlers are properly registered.""" - logger = LocalFSDatasetLoggerAdapter() - - # Check that signal handlers are registered - assert signal.getsignal(signal.SIGINT) != signal.SIG_DFL - assert signal.getsignal(signal.SIGTERM) != signal.SIG_DFL - - def test_index_saved_on_sigint(self): - """Test that index is saved when SIGINT is received.""" - logger = LocalFSDatasetLoggerAdapter() - - # Create a test row and log it - test_row = EvaluationRow( - id="test_id_1", - prompt="test prompt", - response="test response", - score=0.8 - ) - logger.log(test_row) - - # Verify index is dirty - assert logger._index_dirty is True - - # Simulate SIGINT - with patch('sys.exit') as mock_exit: - with patch('builtins.print') as mock_print: - # Get the signal handler - sigint_handler = signal.getsignal(signal.SIGINT) - # Call it directly - sigint_handler(signal.SIGINT, None) - - # Verify flush was called and exit was called - assert not logger._index_dirty # Index should be flushed - mock_exit.assert_called_once_with(0) - mock_print.assert_called() - - def test_index_saved_on_sigterm(self): - """Test that index is saved when SIGTERM is received.""" - logger = LocalFSDatasetLoggerAdapter() - - # Create a test row and log it - test_row = EvaluationRow( - id="test_id_2", - prompt="test prompt", - response="test response", - score=0.9 - ) - logger.log(test_row) - - # Verify index is dirty - assert logger._index_dirty is True - - # Simulate SIGTERM - with patch('sys.exit') as mock_exit: - with patch('builtins.print') as mock_print: - # Get the signal handler - sigterm_handler = signal.getsignal(signal.SIGTERM) - # Call it directly - sigterm_handler(signal.SIGTERM, None) - - # Verify flush was called and exit was called - assert not logger._index_dirty # Index should be flushed - mock_exit.assert_called_once_with(0) - mock_print.assert_called() - - def test_force_flush_method(self): - """Test the force_flush method.""" - logger = LocalFSDatasetLoggerAdapter() - - # Create a test row and log it - test_row = EvaluationRow( - id="test_id_3", - prompt="test prompt", - response="test response", - score=0.7 - ) - logger.log(test_row) - - # Verify index is dirty - assert logger._index_dirty is True - - # Force flush - logger.force_flush() - - # Verify index is no longer dirty - assert logger._index_dirty is False - - # Verify index file exists and contains the expected data - assert os.path.exists(logger.index_path) - with open(logger.index_path, 'r') as f: - index_data = json.load(f) - assert "test_id_3" in index_data - - def test_flush_error_handling(self): - """Test that flush errors are handled gracefully.""" - logger = LocalFSDatasetLoggerAdapter() - - # Create a test row and log it - test_row = EvaluationRow( - id="test_id_4", - prompt="test prompt", - response="test response", - score=0.6 - ) - logger.log(test_row) - - # Mock _save_index_to_disk to raise an exception - with patch.object(logger, '_save_index_to_disk', side_effect=Exception("Test error")): - with patch('builtins.print') as mock_print: - logger.flush() - - # Verify error was logged but not raised - mock_print.assert_called() - assert "Warning: Failed to flush index to disk" in mock_print.call_args[0][0] - - # Verify index is still dirty (so it can be retried) - assert logger._index_dirty is True \ No newline at end of file From cc28ff4c0b6dae9ec50e6d130022a6e13515f41c Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:35:11 -0700 Subject: [PATCH 20/54] remove classnames --- vite-app/src/App.tsx | 37 +++++++++++-------------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index b3ee23d6..edd7fd8c 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -92,38 +92,23 @@ function App() { }, []); return ( -
- From 779c2ed5c828d66b1918f4a7dda9d53030bfe028 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:37:31 -0700 Subject: [PATCH 23/54] revert --- tests/pytest/test_hallucination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pytest/test_hallucination.py b/tests/pytest/test_hallucination.py index b2456bef..fc612800 100644 --- a/tests/pytest/test_hallucination.py +++ b/tests/pytest/test_hallucination.py @@ -34,7 +34,7 @@ def hallucination_dataset_adapter(data: List[Dict[str, Any]]) -> List[Evaluation model=["accounts/fireworks/models/kimi-k2-instruct"], rollout_input_params=[{"temperature": 0.0, "max_tokens": 512}], rollout_processor=default_single_turn_rollout_processor, - threshold_of_success=0.5, + threshold_of_success=1.0, num_runs=1, mode="pointwise", ) From e831eac267d80f6637cda0e86bdddd2b1aa4b42b Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:38:44 -0700 Subject: [PATCH 24/54] add mobx --- vite-app/package.json | 2 ++ vite-app/pnpm-lock.yaml | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/vite-app/package.json b/vite-app/package.json index 7546904a..983b49f7 100644 --- a/vite-app/package.json +++ b/vite-app/package.json @@ -10,6 +10,8 @@ "preview": "vite preview" }, "dependencies": { + "mobx": "^6.13.7", + "mobx-react": "^9.2.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-router-dom": "^7.7.1", diff --git a/vite-app/pnpm-lock.yaml b/vite-app/pnpm-lock.yaml index 64cfb409..81ae4ca2 100644 --- a/vite-app/pnpm-lock.yaml +++ b/vite-app/pnpm-lock.yaml @@ -8,6 +8,12 @@ importers: .: dependencies: + mobx: + specifier: ^6.13.7 + version: 6.13.7 + mobx-react: + specifier: ^9.2.0 + version: 9.2.0(mobx@6.13.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.0 version: 19.1.1 @@ -1094,6 +1100,35 @@ packages: engines: {node: '>=10'} hasBin: true + mobx-react-lite@4.1.0: + resolution: {integrity: sha512-QEP10dpHHBeQNv1pks3WnHRCem2Zp636lq54M2nKO2Sarr13pL4u6diQXf65yzXUn0mkk18SyIDCm9UOJYTi1w==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.0: + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.13.7: + resolution: {integrity: sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1289,6 +1324,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + vite@7.0.6: resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2299,6 +2339,24 @@ snapshots: mkdirp@3.0.1: {} + mobx-react-lite@4.1.0(mobx@6.13.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + mobx: 6.13.7 + react: 19.1.1 + use-sync-external-store: 1.5.0(react@19.1.1) + optionalDependencies: + react-dom: 19.1.1(react@19.1.1) + + mobx-react@9.2.0(mobx@6.13.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + mobx: 6.13.7 + mobx-react-lite: 4.1.0(mobx@6.13.7)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + optionalDependencies: + react-dom: 19.1.1(react@19.1.1) + + mobx@6.13.7: {} + ms@2.1.3: {} nanoid@3.3.11: {} @@ -2482,6 +2540,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.5.0(react@19.1.1): + dependencies: + react: 19.1.1 + vite@7.0.6(jiti@2.5.1)(lightningcss@1.30.1): dependencies: esbuild: 0.25.8 From eb01dc5ff251a5241a8aece8ce1f2e6f03579460 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:44:36 -0700 Subject: [PATCH 25/54] save --- vite-app/src/App.tsx | 48 +++++-- vite-app/src/components/Dashboard.tsx | 7 + vite-app/src/types/eval-protocol-utils.ts | 4 +- vite-app/src/types/eval-protocol.ts | 148 ++++++++++++++++++++++ 4 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 vite-app/src/components/Dashboard.tsx create mode 100644 vite-app/src/types/eval-protocol.ts diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 1cd772e1..4fae1754 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -1,17 +1,35 @@ -import { useEffect, useState, useRef } from "react"; +import { useEffect, useRef } from "react"; +import { makeAutoObservable } from "mobx"; +import { observer } from "mobx-react"; +import Dashboard from "./components/Dashboard"; +import type { EvaluationRow } from "./types/eval-protocol"; interface FileUpdate { type: "file_changed" | "file_created" | "file_deleted"; path: string; timestamp: string; } -function App() { - const [isConnected, setIsConnected] = useState(false); +class GlobalState { + isConnected: boolean = false; + dataset: EvaluationRow[] = []; + constructor() { + makeAutoObservable(this); + } + + setDataset(dataset: EvaluationRow[]) { + this.dataset = dataset; + } +} + +const state = new GlobalState(); + +const BASE_DELAY = 1000; // 1 second +const MAX_RECONNECT_ATTEMPTS = 5; + +const App = observer(() => { const wsRef = useRef(null); const reconnectTimeoutRef = useRef(null); const reconnectAttemptsRef = useRef(0); - const maxReconnectAttempts = 5; - const baseDelay = 1000; // 1 second const connectWebSocket = () => { if (wsRef.current?.readyState === WebSocket.OPEN) { @@ -23,7 +41,7 @@ function App() { ws.onopen = () => { console.log("Connected to file watcher"); - setIsConnected(true); + state.isConnected = true; reconnectAttemptsRef.current = 0; // Reset reconnect attempts on successful connection }; @@ -38,12 +56,12 @@ function App() { ws.onclose = (event) => { console.log("Disconnected from file watcher", event.code, event.reason); - setIsConnected(false); + state.isConnected = false; // Attempt to reconnect if not a normal closure if ( event.code !== 1000 && - reconnectAttemptsRef.current < maxReconnectAttempts + reconnectAttemptsRef.current < MAX_RECONNECT_ATTEMPTS ) { scheduleReconnect(); } @@ -51,7 +69,7 @@ function App() { ws.onerror = (error) => { console.error("WebSocket error:", error); - setIsConnected(false); + state.isConnected = false; }; }; @@ -60,7 +78,7 @@ function App() { clearTimeout(reconnectTimeoutRef.current); } - const delay = baseDelay * Math.pow(2, reconnectAttemptsRef.current); // Exponential backoff + const delay = BASE_DELAY * Math.pow(2, reconnectAttemptsRef.current); // Exponential backoff console.log( `Scheduling reconnect attempt ${ reconnectAttemptsRef.current + 1 @@ -70,7 +88,7 @@ function App() { reconnectTimeoutRef.current = setTimeout(() => { reconnectAttemptsRef.current++; console.log( - `Attempting to reconnect (attempt ${reconnectAttemptsRef.current}/${maxReconnectAttempts})` + `Attempting to reconnect (attempt ${reconnectAttemptsRef.current}/${MAX_RECONNECT_ATTEMPTS})` ); connectWebSocket(); }, delay); @@ -95,15 +113,17 @@ function App() {

Eval Protocol Logs

-
{isConnected ? "Connected" : "Disconnected"}
+
{state.isConnected ? "Connected" : "Disconnected"}
+
+
+
-
TODO
TODO
); -} +}); export default App; diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx new file mode 100644 index 00000000..f203c901 --- /dev/null +++ b/vite-app/src/components/Dashboard.tsx @@ -0,0 +1,7 @@ +import { observer } from "mobx-react"; + +const Dashboard = observer(() => { + return
Dashboard
; +}); + +export default Dashboard; diff --git a/vite-app/src/types/eval-protocol-utils.ts b/vite-app/src/types/eval-protocol-utils.ts index 67d66056..656f9373 100644 --- a/vite-app/src/types/eval-protocol-utils.ts +++ b/vite-app/src/types/eval-protocol-utils.ts @@ -1,4 +1,4 @@ -import { EvaluationRow, Message } from './eval-protocol'; +import type { EvaluationRow, Message } from './eval-protocol'; /** * Utility functions for working with EvaluationRow data @@ -173,4 +173,4 @@ export const evaluateResultUtils = { getStepCount: (result: any): number => { return result.step_outputs?.length || 0; } -}; \ No newline at end of file +}; diff --git a/vite-app/src/types/eval-protocol.ts b/vite-app/src/types/eval-protocol.ts new file mode 100644 index 00000000..87ec8304 --- /dev/null +++ b/vite-app/src/types/eval-protocol.ts @@ -0,0 +1,148 @@ +import { z } from 'zod'; + + +// Base schemas +export const ChatCompletionContentPartTextParamSchema = z.object({ + text: z.string().describe('The text content.'), + type: z.literal('text').default('text').describe('The type of the content part.') +}); + +export const FunctionCallSchema = z.object({ + name: z.string(), + arguments: z.string() +}); + +export const ChatCompletionMessageToolCallSchema = z.object({ + id: z.string(), + type: z.literal('function'), + function: FunctionCallSchema +}); + +export const MessageSchema = z.object({ + role: z.string().describe('assistant, user, system, tool'), + content: z.union([z.string(), z.array(ChatCompletionContentPartTextParamSchema)]).optional().default('').describe('The content of the message.'), + name: z.string().optional(), + tool_call_id: z.string().optional(), + tool_calls: z.array(ChatCompletionMessageToolCallSchema).optional(), + function_call: FunctionCallSchema.optional(), + control_plane_step: z.record(z.string(), z.any()).optional() +}); + +export const MetricResultSchema = z.object({ + is_score_valid: z.boolean().default(true), + score: z.number().min(0.0).max(1.0), + reason: z.string() +}); + +export const StepOutputSchema = z.object({ + step_index: z.union([z.number(), z.string()]).describe('User-defined index for the step (e.g., assistant message index, turn number). This is used by the system to map this output to the internal StepData.'), + base_reward: z.number().describe('Base reward calculated by the user\'s reward function for this step.'), + terminated: z.boolean().default(false).describe('Whether the environment signaled termination at this step.'), + control_plane_info: z.record(z.string(), z.any()).optional().describe('Structured info from the environment\'s control plane.'), + metrics: z.record(z.string(), z.any()).default({}).describe('Optional dictionary of custom metrics for this step.'), + reason: z.string().optional().describe('Optional explanation for the step\'s base reward or metrics.') +}); + +export const EvaluateResultSchema = z.object({ + score: z.number().describe('The overall evaluation score, typically between 0.0 and 1.0.'), + is_score_valid: z.boolean().default(true).describe('Whether the overall score is valid.'), + reason: z.string().optional().describe('Optional explanation for the overall score.'), + metrics: z.record(z.string(), MetricResultSchema).default({}).describe('Dictionary of component metrics for detailed breakdown.'), + step_outputs: z.array(StepOutputSchema).optional().describe('For RL, a list of outputs for each conceptual step, providing base rewards.'), + error: z.string().optional().describe('Optional error message if the evaluation itself encountered an issue.'), + trajectory_info: z.record(z.string(), z.any()).optional().describe('Additional trajectory-level information (duration, steps, termination_reason, etc.).'), + final_control_plane_info: z.record(z.string(), z.any()).optional().describe('The final control plane state that led to termination.') +}); + +export const CompletionParamsSchema = z.object({ + model: z.string().describe('Model identifier (e.g., \'gpt-4.1\', \'fireworks/llama\')'), + temperature: z.number().optional().describe('Temperature setting for model generation'), + max_tokens: z.number().optional().describe('Maximum tokens to generate'), + max_tool_calls: z.number().optional().describe('Maximum tool calls per turn') +}); + +export const InputMetadataSchema = z.object({ + row_id: z.string().describe('Unique string to ID the row'), + completion_params: CompletionParamsSchema.optional().describe('Completion endpoint parameters used'), + dataset_info: z.record(z.string(), z.any()).optional().describe('Dataset row details: seed, system_prompt, environment_context, etc'), + session_data: z.record(z.string(), z.any()).optional().describe('Session metadata like timestamp (input only, no duration/usage)') +}).loose(); + +export const CompletionUsageSchema = z.object({ + prompt_tokens: z.number(), + completion_tokens: z.number(), + total_tokens: z.number() +}); + +export const EvaluationRowSchema = z.object({ + messages: z.array(MessageSchema).describe('List of messages in the conversation/trajectory.'), + tools: z.array(z.record(z.string(), z.any())).optional().describe('Available tools/functions that were provided to the agent.'), + input_metadata: InputMetadataSchema.describe('Metadata related to the input (dataset info, model config, session data, etc.).'), + ground_truth: z.string().optional().describe('Optional ground truth reference for this evaluation.'), + evaluation_result: EvaluateResultSchema.optional().describe('The evaluation result for this row/trajectory.'), + usage: CompletionUsageSchema.optional().describe('Token usage statistics from LLM calls during execution.'), + created_at: z.date().default(() => new Date()).describe('The timestamp when the row was created.') +}); + +// Agent Evaluation Framework (V2) schemas +export const ResourceServerConfigSchema = z.object({ + start_command: z.string().describe('The command to start the server. The string \'{port}\' will be replaced with a dynamically allocated free port.'), + health_check_url: z.string().describe('The URL to poll to check if the server is ready. The string \'{port}\' will be replaced with the allocated port.') +}); + +export const EvaluationCriteriaModelSchema = z.object({ + final_state_query: z.string().optional().describe('A query (e.g., SQL) to run on the final state of the resource.'), + expected_query_result_transform: z.string().optional().describe('A Python lambda string (e.g., \'lambda x: x > 0\') to transform and evaluate the query result to a boolean.'), + ground_truth_function_calls: z.array(z.array(z.string())).optional().describe('Ground truth function calls for BFCL evaluation.'), + ground_truth_comparable_state: z.record(z.string(), z.any()).optional().describe('Ground truth comparable state for BFCL evaluation.') +}); + +export const TaskDefinitionModelSchema = z.object({ + name: z.string().describe('Unique name for the task.'), + description: z.string().optional().describe('A brief description of the task.'), + resource_type: z.string().describe('The type of ForkableResource to use (e.g., \'SQLResource\', \'PythonStateResource\', \'FileSystemResource\', \'DockerResource\').'), + base_resource_config: z.record(z.string(), z.any()).default({}).describe('Configuration dictionary passed to the base resource\'s setup() method.'), + tools_module_path: z.string().optional().describe('Optional Python import path to a module containing custom tool functions for this task.'), + reward_function_path: z.string().describe('Python import path to the reward function (e.g., \'my_module.my_reward_func\').'), + goal_description: z.string().optional().describe('A human-readable description of the agent\'s goal for this task.'), + evaluation_criteria: EvaluationCriteriaModelSchema.optional().describe('Criteria used by the Orchestrator to determine if the primary goal was achieved.'), + initial_user_prompt: z.string().optional().describe('The initial prompt or message to start the agent interaction. Deprecated if \'messages\' field is used for multi-turn.'), + messages: z.array(z.record(z.string(), z.any())).optional().describe('A list of messages to start the conversation, can represent multiple user turns for sequential processing.'), + poc_max_turns: z.number().int().min(1).default(3).describe('For PoC Orchestrator, the maximum number of interaction turns.'), + resource_server: ResourceServerConfigSchema.optional().describe('Configuration for a background server required for the task.'), + num_rollouts: z.number().int().min(1).default(1).describe('Number of parallel rollouts to execute for this task definition.'), + dataset_path: z.string().optional().describe('Path to dataset file (JSONL) containing experimental conditions for data-driven evaluation.'), + num_rollouts_per_sample: z.number().int().min(1).default(1).describe('Number of rollouts to execute per sample from the dataset.') +}).loose(); // equivalent to extra="allow" in Pydantic + +// MCP Configuration schemas +export const MCPConfigurationServerStdioSchema = z.object({ + command: z.string().describe('command to run the MCP server'), + args: z.array(z.string()).default([]).describe('to pass to the command'), + env: z.array(z.string()).default([]).describe('List of environment variables to verify exist in the environment') +}); + +export const MCPConfigurationServerUrlSchema = z.object({ + url: z.string().describe('url to the MCP server') +}); + +export const MCPMultiClientConfigurationSchema = z.object({ + mcpServers: z.record(z.string(), z.union([MCPConfigurationServerStdioSchema, MCPConfigurationServerUrlSchema])) +}); + +// Export TypeScript types derived from the schemas +export type ChatCompletionContentPartTextParam = z.infer; +export type Message = z.infer; +export type MetricResult = z.infer; +export type StepOutput = z.infer; +export type EvaluateResult = z.infer; +export type CompletionParams = z.infer; +export type InputMetadata = z.infer; +export type CompletionUsage = z.infer; +export type EvaluationRow = z.infer; +export type ResourceServerConfig = z.infer; +export type EvaluationCriteriaModel = z.infer; +export type TaskDefinitionModel = z.infer; +export type MCPConfigurationServerStdio = z.infer; +export type MCPConfigurationServerUrl = z.infer; +export type MCPMultiClientConfiguration = z.infer; From 58d81500e5637e9e47ed22dd8bb597ccd213482c Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 15:45:07 -0700 Subject: [PATCH 26/54] set threshold lower --- tests/pytest/test_hallucination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pytest/test_hallucination.py b/tests/pytest/test_hallucination.py index fc612800..87348ead 100644 --- a/tests/pytest/test_hallucination.py +++ b/tests/pytest/test_hallucination.py @@ -34,7 +34,7 @@ def hallucination_dataset_adapter(data: List[Dict[str, Any]]) -> List[Evaluation model=["accounts/fireworks/models/kimi-k2-instruct"], rollout_input_params=[{"temperature": 0.0, "max_tokens": 512}], rollout_processor=default_single_turn_rollout_processor, - threshold_of_success=1.0, + threshold_of_success=0.33, num_runs=1, mode="pointwise", ) From 7caa4d7906755c99a6092025bcb2aa90bc50651c Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 16:46:03 -0700 Subject: [PATCH 27/54] data is being set properly --- eval_protocol/utils/logs_server.py | 10 +- vite-app/src/App.tsx | 21 +-- vite-app/src/components/Dashboard.tsx | 7 +- vite-app/src/types/eval-protocol-utils.ts | 176 ---------------------- vite-app/src/types/eval-protocol.ts | 5 +- vite-app/src/types/websocket.ts | 57 +++++++ 6 files changed, 85 insertions(+), 191 deletions(-) delete mode 100644 vite-app/src/types/eval-protocol-utils.ts create mode 100644 vite-app/src/types/websocket.ts diff --git a/eval_protocol/utils/logs_server.py b/eval_protocol/utils/logs_server.py index 8017f73e..d8ae3f57 100644 --- a/eval_protocol/utils/logs_server.py +++ b/eval_protocol/utils/logs_server.py @@ -1,15 +1,15 @@ import asyncio -from contextlib import asynccontextmanager import json import logging import os import time +from contextlib import asynccontextmanager from typing import List, Optional -from watchdog.events import FileSystemEventHandler, FileSystemEvent -from watchdog.observers import Observer import uvicorn from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from watchdog.events import FileSystemEvent, FileSystemEventHandler +from watchdog.observers import Observer from eval_protocol.dataset_logger import default_logger from eval_protocol.utils.vite_server import ViteServer @@ -79,7 +79,9 @@ async def connect(self, websocket: WebSocket): logs = default_logger.read() asyncio.run_coroutine_threadsafe( websocket.send_text( - json.dumps({"type": "initialize_logs", "logs": [log.model_dump_json() for log in logs]}) + json.dumps( + {"type": "initialize_logs", "logs": [log.model_dump_json(exclude_none=True) for log in logs]} + ) ), self._loop, ) diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 4fae1754..0a086ea4 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -2,12 +2,8 @@ import { useEffect, useRef } from "react"; import { makeAutoObservable } from "mobx"; import { observer } from "mobx-react"; import Dashboard from "./components/Dashboard"; -import type { EvaluationRow } from "./types/eval-protocol"; -interface FileUpdate { - type: "file_changed" | "file_created" | "file_deleted"; - path: string; - timestamp: string; -} +import { EvaluationRowSchema, type EvaluationRow } from "./types/eval-protocol"; +import { WebSocketServerMessageSchema } from "./types/websocket"; class GlobalState { isConnected: boolean = false; @@ -21,7 +17,7 @@ class GlobalState { } } -const state = new GlobalState(); +export const state = new GlobalState(); const BASE_DELAY = 1000; // 1 second const MAX_RECONNECT_ATTEMPTS = 5; @@ -47,8 +43,15 @@ const App = observer(() => { ws.onmessage = (event) => { try { - const update: FileUpdate = JSON.parse(event.data); - console.log(update); + const update = WebSocketServerMessageSchema.parse( + JSON.parse(event.data) + ); + if (update.type === "initialize_logs") { + const rows: EvaluationRow[] = update.logs.map((log) => { + return EvaluationRowSchema.parse(JSON.parse(log)); + }); + state.setDataset(rows); + } } catch (error) { console.error("Failed to parse WebSocket message:", error); } diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index f203c901..089059e0 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -1,7 +1,12 @@ import { observer } from "mobx-react"; +import { state } from "../App"; const Dashboard = observer(() => { - return
Dashboard
; + return ( +
+ Dashboard
{JSON.stringify(state.dataset)}
+
+ ); }); export default Dashboard; diff --git a/vite-app/src/types/eval-protocol-utils.ts b/vite-app/src/types/eval-protocol-utils.ts deleted file mode 100644 index 656f9373..00000000 --- a/vite-app/src/types/eval-protocol-utils.ts +++ /dev/null @@ -1,176 +0,0 @@ -import type { EvaluationRow, Message } from './eval-protocol'; - -/** - * Utility functions for working with EvaluationRow data - * These mirror the methods from the Python EvaluationRow class - */ - -export const evalRowUtils = { - /** - * Returns True if this represents a trajectory evaluation (has step_outputs), - * False if it represents a single turn evaluation. - */ - isTrajectoryEvaluation: (row: EvaluationRow): boolean => { - return ( - row.evaluation_result !== undefined && - row.evaluation_result.step_outputs !== undefined && - row.evaluation_result.step_outputs.length > 0 - ); - }, - - /** - * Returns the number of messages in the conversation. - */ - getConversationLength: (row: EvaluationRow): number => { - return row.messages.length; - }, - - /** - * Returns the system message from the conversation. Returns empty Message if none found. - */ - getSystemMessage: (row: EvaluationRow): Message => { - const systemMessages = row.messages.filter(msg => msg.role === 'system'); - if (systemMessages.length === 0) { - return { role: 'system', content: '' }; - } - return systemMessages[0]; - }, - - /** - * Returns only the assistant messages from the conversation. - */ - getAssistantMessages: (row: EvaluationRow): Message[] => { - return row.messages.filter(msg => msg.role === 'assistant'); - }, - - /** - * Returns only the user messages from the conversation. - */ - getUserMessages: (row: EvaluationRow): Message[] => { - return row.messages.filter(msg => msg.role === 'user'); - }, - - /** - * Helper method to get a specific value from input_metadata. - */ - getInputMetadata: (row: EvaluationRow, key: string, defaultValue?: any): any => { - if (!row.input_metadata) { - return defaultValue; - } - return (row.input_metadata as any)[key] ?? defaultValue; - }, - - /** - * Get number of steps from control_plane_step data. - */ - getSteps: (row: EvaluationRow): number => { - return row.messages.filter(msg => msg.control_plane_step).length; - }, - - /** - * Get total reward from control_plane_step data. - */ - getTotalReward: (row: EvaluationRow): number => { - const messagesWithControlPlane = row.messages.filter(msg => msg.control_plane_step); - if (messagesWithControlPlane.length === 0) { - return 0.0; - } - return messagesWithControlPlane.reduce((total, msg) => { - const reward = (msg.control_plane_step as any)?.reward; - return total + (typeof reward === 'number' ? reward : 0); - }, 0.0); - }, - - /** - * Get termination status from control_plane_step data. - */ - getTerminated: (row: EvaluationRow): boolean => { - const messagesWithControlPlane = row.messages.filter(msg => msg.control_plane_step); - if (messagesWithControlPlane.length === 0) { - return false; - } - return messagesWithControlPlane.some(msg => { - return (msg.control_plane_step as any)?.terminated === true; - }); - }, - - /** - * Get termination reason from the final control_plane_step data. - */ - getTerminationReason: (row: EvaluationRow): string => { - // Find the last message with control_plane_step that has termination_reason - for (let i = row.messages.length - 1; i >= 0; i--) { - const msg = row.messages[i]; - if (msg.control_plane_step && (msg.control_plane_step as any)?.termination_reason) { - return (msg.control_plane_step as any).termination_reason; - } - } - return 'unknown'; - } -}; - -/** - * Utility functions for working with Message data - */ -export const messageUtils = { - /** - * Check if a message has tool calls - */ - hasToolCalls: (message: Message): boolean => { - return message.tool_calls !== undefined && message.tool_calls.length > 0; - }, - - /** - * Check if a message has function calls - */ - hasFunctionCall: (message: Message): boolean => { - return message.function_call !== undefined; - }, - - /** - * Get the content as a string, handling both string and array content types - */ - getContentAsString: (message: Message): string => { - if (typeof message.content === 'string') { - return message.content; - } - if (Array.isArray(message.content)) { - return message.content - .filter(part => part.type === 'text') - .map(part => part.text) - .join(''); - } - return ''; - } -}; - -/** - * Utility functions for working with EvaluateResult data - */ -export const evaluateResultUtils = { - /** - * Check if the evaluation result has step outputs (trajectory evaluation) - */ - hasStepOutputs: (result: any): boolean => { - return result.step_outputs !== undefined && result.step_outputs.length > 0; - }, - - /** - * Get the total base reward from step outputs - */ - getTotalBaseReward: (result: any): number => { - if (!result.step_outputs) { - return 0.0; - } - return result.step_outputs.reduce((total: number, step: any) => { - return total + (step.base_reward || 0); - }, 0.0); - }, - - /** - * Get the number of steps from step outputs - */ - getStepCount: (result: any): number => { - return result.step_outputs?.length || 0; - } -}; diff --git a/vite-app/src/types/eval-protocol.ts b/vite-app/src/types/eval-protocol.ts index 87ec8304..e08c9b7e 100644 --- a/vite-app/src/types/eval-protocol.ts +++ b/vite-app/src/types/eval-protocol.ts @@ -81,7 +81,10 @@ export const EvaluationRowSchema = z.object({ ground_truth: z.string().optional().describe('Optional ground truth reference for this evaluation.'), evaluation_result: EvaluateResultSchema.optional().describe('The evaluation result for this row/trajectory.'), usage: CompletionUsageSchema.optional().describe('Token usage statistics from LLM calls during execution.'), - created_at: z.date().default(() => new Date()).describe('The timestamp when the row was created.') + created_at: z.preprocess( + (val) => typeof val === "string" ? new Date(val) : val, + z.date() + ).describe('The timestamp when the row was created. Accepts string and parses to Date.') }); // Agent Evaluation Framework (V2) schemas diff --git a/vite-app/src/types/websocket.ts b/vite-app/src/types/websocket.ts new file mode 100644 index 00000000..087ea1d1 --- /dev/null +++ b/vite-app/src/types/websocket.ts @@ -0,0 +1,57 @@ +// WebSocket message types based on logs_server.py +import { z } from 'zod'; + +// Zod Schemas for runtime validation + +// File update message schema +export const FileUpdateMessageSchema = z.object({ + type: z.enum(['file_created', 'file_changed', 'file_deleted']), + path: z.string(), + timestamp: z.number(), + contents: z.string().nullable().optional(), +}); + +// Initialize logs message schema +export const InitializeLogsMessageSchema = z.object({ + type: z.literal('initialize_logs'), + logs: z.array(z.string()), +}); + +// Union schema for all WebSocket server messages +export const WebSocketServerMessageSchema = z.discriminatedUnion('type', [ + FileUpdateMessageSchema, + InitializeLogsMessageSchema, +] as const); + +// Server status response schema +export const ServerStatusResponseSchema = z.object({ + status: z.literal('ok'), + build_dir: z.string(), + active_connections: z.number(), + watch_paths: z.array(z.string()), +}); + +// File system event schema +export const FileSystemEventSchema = z.object({ + type: z.enum(['file_created', 'file_changed', 'file_deleted']), + path: z.string(), + timestamp: z.number(), + contents: z.string().nullable().optional(), +}); + +// Log entry schema +export const LogEntrySchema = z.object({ + id: z.string(), + timestamp: z.string(), + level: z.enum(['DEBUG', 'INFO', 'WARNING', 'ERROR']), + message: z.string(), + metadata: z.record(z.string(), z.any()).optional(), +}); + +// Type inference from Zod schemas +export type FileUpdateMessage = z.infer; +export type InitializeLogsMessage = z.infer; +export type WebSocketServerMessage = z.infer; +export type ServerStatusResponse = z.infer; +export type FileSystemEvent = z.infer; +export type LogEntry = z.infer; From ac83ce6132f8f6e74e8a8d9ac9a0ccbfbf484f64 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:07:15 -0700 Subject: [PATCH 28/54] refactor App component layout and styling for improved UI --- vite-app/src/App.tsx | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 0a086ea4..79f42b33 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -111,20 +111,38 @@ const App = observer(() => { }, []); return ( -
-
- +
); diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index 16af2114..4c521bb1 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -1,350 +1,51 @@ import { observer } from "mobx-react"; -import { useState } from "react"; import { state } from "../App"; -import type { EvaluationRow, Message } from "../types/eval-protocol"; +import Button from "./Button"; +import { Row } from "./Row"; -const MessageBubble = ({ message }: { message: Message }) => { - const isUser = message.role === "user"; - const isSystem = message.role === "system"; - const hasToolCalls = message.tool_calls && message.tool_calls.length > 0; - const hasFunctionCall = message.function_call; +interface DashboardProps { + onRefresh: () => void; +} - return ( -
-
-
- {message.role} - {(hasToolCalls || hasFunctionCall) && ( - • Tool Call - )} -
-
- {typeof message.content === "string" - ? message.content - : Array.isArray(message.content) - ? message.content - .map((part, i) => - part.type === "text" ? part.text : JSON.stringify(part) - ) - .join("") - : JSON.stringify(message.content)} -
- {hasToolCalls && message.tool_calls && ( -
-
- Tool Calls: -
- {message.tool_calls.map((call, i) => ( -
-
- {call.function.name} -
-
- {call.function.arguments} -
-
- ))} -
- )} - {hasFunctionCall && message.function_call && ( -
-
- Function Call: -
-
-
- {message.function_call.name} -
-
- {message.function_call.arguments} -
-
-
- )} -
-
- ); -}; - -const MetadataSection = ({ title, data }: { title: string; data: any }) => { - if (!data || Object.keys(data).length === 0) return null; +const EmptyState = ({ onRefresh }: { onRefresh: () => void }) => { + const handleRefresh = () => { + onRefresh(); + }; return ( -
-

{title}

-
-
-          {JSON.stringify(data, null, 1)}
-        
+
+
+
+ + + +
+

+ No evaluation data available +

+

+ No evaluation rows have been loaded yet. Click refresh to reconnect + and load data. +

+
); }; -const Row = observer( - ({ row, index }: { row: EvaluationRow; index: number }) => { - const [isExpanded, setIsExpanded] = useState(false); - - const toggleExpanded = () => setIsExpanded(!isExpanded); - - return ( -
- {/* Collapsed Row - Shows Metadata */} -
-
- {isExpanded ? ( - - - - ) : ( - - - - )} -
-
-
- ID:{" "} - {row.input_metadata.row_id} -
-
- Model:{" "} - - {row.input_metadata.completion_params?.model || "N/A"} - -
-
- Score:{" "} - = 0.8 - ? "text-green-700" - : row.evaluation_result.score >= 0.6 - ? "text-yellow-700" - : "text-red-700" - : "text-gray-500" - }`} - > - {row.evaluation_result?.score?.toFixed(3) || "N/A"} - -
-
- Messages:{" "} - {row.messages.length} -
-
-
- - {/* Expanded Content */} - {isExpanded && ( -
-
- {/* Left Column - Chat Interface */} -
-

- Conversation ({row.messages.length} messages) -

-
- {row.messages.map((message, msgIndex) => ( - - ))} -
-
- - {/* Right Column - Metadata */} -
-

- Metadata -

- - {/* Evaluation Result - Most Important */} - {row.evaluation_result && ( -
-
- Evaluation Result -
-
-
-
- - Score: - {" "} - = 0.8 - ? "text-green-700" - : row.evaluation_result.score >= 0.6 - ? "text-yellow-700" - : "text-red-700" - }`} - > - {row.evaluation_result.score} - -
-
- - Valid: - {" "} - - {row.evaluation_result.is_score_valid - ? "Yes" - : "No"} - -
-
- {row.evaluation_result.reason && ( -
- - Reason: - {" "} - - {row.evaluation_result.reason} - -
- )} - {row.evaluation_result.metrics && - Object.keys(row.evaluation_result.metrics).length > - 0 && ( -
- - Metrics: - -
-                              {JSON.stringify(
-                                row.evaluation_result.metrics,
-                                null,
-                                1
-                              )}
-                            
-
- )} -
-
- )} - - {/* Ground Truth - Secondary Importance */} - {row.ground_truth && ( -
-
- Ground Truth -
-
-
- {row.ground_truth} -
-
-
- )} - - {/* Usage Stats - Compact */} - {row.usage && ( -
-
- Token Usage -
-
-
-
- - Prompt: - {" "} - - {row.usage.prompt_tokens} - -
-
- - Completion: - {" "} - - {row.usage.completion_tokens} - -
-
- - Total: - {" "} - - {row.usage.total_tokens} - -
-
-
-
- )} - - {/* Input Metadata - Less Important */} - - - {/* Tools - Least Important */} - {row.tools && row.tools.length > 0 && ( -
-
- Available Tools -
-
-
-                        {JSON.stringify(row.tools, null, 1)}
-                      
-
-
- )} -
-
-
- )} -
- ); - } -); - -const Dashboard = observer(() => { +const Dashboard = observer(({ onRefresh }: DashboardProps) => { return (
{/* Summary Stats */} @@ -383,25 +84,29 @@ const Dashboard = observer(() => {
- {/* Main Table */} -
- {/* Table Header */} -
-
-
Row ID
-
Model
-
Score
-
Messages
+ {/* Show empty state or main table */} + {state.dataset.length === 0 ? ( + + ) : ( +
+ {/* Table Header */} +
+
+
Row ID
+
Model
+
Score
+
Messages
+
-
- {/* Table Rows */} -
- {state.dataset.map((row, index) => ( - - ))} + {/* Table Rows */} +
+ {state.dataset.map((row, index) => ( + + ))} +
-
+ )}
); }); diff --git a/vite-app/src/components/MessageBubble.tsx b/vite-app/src/components/MessageBubble.tsx new file mode 100644 index 00000000..f40a8e1e --- /dev/null +++ b/vite-app/src/components/MessageBubble.tsx @@ -0,0 +1,77 @@ +import type { Message } from "../types/eval-protocol"; + +export const MessageBubble = ({ message }: { message: Message }) => { + const isUser = message.role === "user"; + const isSystem = message.role === "system"; + const hasToolCalls = message.tool_calls && message.tool_calls.length > 0; + const hasFunctionCall = message.function_call; + + return ( +
+
+
+ {message.role} + {(hasToolCalls || hasFunctionCall) && ( + • Tool Call + )} +
+
+ {typeof message.content === "string" + ? message.content + : Array.isArray(message.content) + ? message.content + .map((part, i) => + part.type === "text" ? part.text : JSON.stringify(part) + ) + .join("") + : JSON.stringify(message.content)} +
+ {hasToolCalls && message.tool_calls && ( +
+
+ Tool Calls: +
+ {message.tool_calls.map((call, i) => ( +
+
+ {call.function.name} +
+
+ {call.function.arguments} +
+
+ ))} +
+ )} + {hasFunctionCall && message.function_call && ( +
+
+ Function Call: +
+
+
+ {message.function_call.name} +
+
+ {message.function_call.arguments} +
+
+
+ )} +
+
+ ); +}; diff --git a/vite-app/src/components/MetadataSection.tsx b/vite-app/src/components/MetadataSection.tsx new file mode 100644 index 00000000..2e4cced4 --- /dev/null +++ b/vite-app/src/components/MetadataSection.tsx @@ -0,0 +1,20 @@ +export const MetadataSection = ({ + title, + data, +}: { + title: string; + data: any; +}) => { + if (!data || Object.keys(data).length === 0) return null; + + return ( +
+

{title}

+
+
+          {JSON.stringify(data, null, 1)}
+        
+
+
+ ); +}; diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx new file mode 100644 index 00000000..d44d277c --- /dev/null +++ b/vite-app/src/components/Row.tsx @@ -0,0 +1,255 @@ +import { observer } from "mobx-react"; +import { useState } from "react"; +import type { EvaluationRow } from "../types/eval-protocol"; +import { MessageBubble } from "./MessageBubble"; +import { MetadataSection } from "./MetadataSection"; + +export const Row = observer( + ({ row, index }: { row: EvaluationRow; index: number }) => { + const [isExpanded, setIsExpanded] = useState(false); + + const toggleExpanded = () => setIsExpanded(!isExpanded); + + return ( +
+ {/* Collapsed Row - Shows Metadata */} +
+
+ {isExpanded ? ( + + + + ) : ( + + + + )} +
+
+
+ ID:{" "} + {row.input_metadata.row_id} +
+
+ Model:{" "} + + {row.input_metadata.completion_params?.model || "N/A"} + +
+
+ Score:{" "} + = 0.8 + ? "text-green-700" + : row.evaluation_result.score >= 0.6 + ? "text-yellow-700" + : "text-red-700" + : "text-gray-500" + }`} + > + {row.evaluation_result?.score?.toFixed(3) || "N/A"} + +
+
+ Messages:{" "} + {row.messages.length} +
+
+
+ + {/* Expanded Content */} + {isExpanded && ( +
+
+ {/* Left Column - Chat Interface */} +
+

+ Conversation ({row.messages.length} messages) +

+
+ {row.messages.map((message, msgIndex) => ( + + ))} +
+
+ + {/* Right Column - Metadata */} +
+

+ Metadata +

+ + {/* Evaluation Result - Most Important */} + {row.evaluation_result && ( +
+
+ Evaluation Result +
+
+
+
+ + Score: + {" "} + = 0.8 + ? "text-green-700" + : row.evaluation_result.score >= 0.6 + ? "text-yellow-700" + : "text-red-700" + }`} + > + {row.evaluation_result.score} + +
+
+ + Valid: + {" "} + + {row.evaluation_result.is_score_valid + ? "Yes" + : "No"} + +
+
+ {row.evaluation_result.reason && ( +
+ + Reason: + {" "} + + {row.evaluation_result.reason} + +
+ )} + {row.evaluation_result.metrics && + Object.keys(row.evaluation_result.metrics).length > + 0 && ( +
+ + Metrics: + +
+                              {JSON.stringify(
+                                row.evaluation_result.metrics,
+                                null,
+                                1
+                              )}
+                            
+
+ )} +
+
+ )} + + {/* Ground Truth - Secondary Importance */} + {row.ground_truth && ( +
+
+ Ground Truth +
+
+
+ {row.ground_truth} +
+
+
+ )} + + {/* Usage Stats - Compact */} + {row.usage && ( +
+
+ Token Usage +
+
+
+
+ + Prompt: + {" "} + + {row.usage.prompt_tokens} + +
+
+ + Completion: + {" "} + + {row.usage.completion_tokens} + +
+
+ + Total: + {" "} + + {row.usage.total_tokens} + +
+
+
+
+ )} + + {/* Input Metadata - Less Important */} + + + {/* Tools - Least Important */} + {row.tools && row.tools.length > 0 && ( +
+
+ Available Tools +
+
+
+                        {JSON.stringify(row.tools, null, 1)}
+                      
+
+
+ )} +
+
+
+ )} +
+ ); + } +); From aee6e4698f50d4ea76d56a5e6af761190b9d6ffe Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:24:55 -0700 Subject: [PATCH 31/54] refactor state management by moving GlobalState to a separate file --- vite-app/src/App.tsx | 14 +------------- vite-app/src/GlobalState.tsx | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 vite-app/src/GlobalState.tsx diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 03e24c0a..9aaa450a 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -1,23 +1,11 @@ import { useEffect, useRef } from "react"; -import { makeAutoObservable } from "mobx"; import { observer } from "mobx-react"; import Dashboard from "./components/Dashboard"; import Button from "./components/Button"; import StatusIndicator from "./components/StatusIndicator"; import { EvaluationRowSchema, type EvaluationRow } from "./types/eval-protocol"; import { WebSocketServerMessageSchema } from "./types/websocket"; - -class GlobalState { - isConnected: boolean = false; - dataset: EvaluationRow[] = []; - constructor() { - makeAutoObservable(this); - } - - setDataset(dataset: EvaluationRow[]) { - this.dataset = dataset; - } -} +import { GlobalState } from "./GlobalState"; export const state = new GlobalState(); diff --git a/vite-app/src/GlobalState.tsx b/vite-app/src/GlobalState.tsx new file mode 100644 index 00000000..c80652bc --- /dev/null +++ b/vite-app/src/GlobalState.tsx @@ -0,0 +1,14 @@ +import { makeAutoObservable } from "mobx"; +import type { EvaluationRow } from "./types/eval-protocol"; + +export class GlobalState { + isConnected: boolean = false; + dataset: EvaluationRow[] = []; + constructor() { + makeAutoObservable(this); + } + + setDataset(dataset: EvaluationRow[]) { + this.dataset = dataset; + } +} From 50e9967f548f0f2622858c14d56a49f3e0009496 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:32:26 -0700 Subject: [PATCH 32/54] more updates --- vite-app/src/components/Dashboard.tsx | 8 --- vite-app/src/components/MessageBubble.tsx | 76 +++++++++++++++++------ vite-app/src/components/Row.tsx | 6 +- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index 4c521bb1..fedcdd40 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -69,14 +69,6 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => { ).toFixed(3) : "N/A"}
-
- Connected:{" "} - { - state.dataset.filter( - (row) => row.evaluation_result?.is_score_valid - ).length - } -
Total Messages:{" "} {state.dataset.reduce((sum, row) => sum + row.messages.length, 0)} diff --git a/vite-app/src/components/MessageBubble.tsx b/vite-app/src/components/MessageBubble.tsx index f40a8e1e..69374cd2 100644 --- a/vite-app/src/components/MessageBubble.tsx +++ b/vite-app/src/components/MessageBubble.tsx @@ -3,29 +3,27 @@ import type { Message } from "../types/eval-protocol"; export const MessageBubble = ({ message }: { message: Message }) => { const isUser = message.role === "user"; const isSystem = message.role === "system"; + const isTool = message.role === "tool"; const hasToolCalls = message.tool_calls && message.tool_calls.length > 0; const hasFunctionCall = message.function_call; return (
{message.role} - {(hasToolCalls || hasFunctionCall) && ( - • Tool Call - )}
-
+
{typeof message.content === "string" ? message.content : Array.isArray(message.content) @@ -37,19 +35,39 @@ export const MessageBubble = ({ message }: { message: Message }) => { : JSON.stringify(message.content)}
{hasToolCalls && message.tool_calls && ( -
-
+
+
Tool Calls:
{message.tool_calls.map((call, i) => (
-
+
{call.function.name}
-
+
{call.function.arguments}
@@ -57,15 +75,37 @@ export const MessageBubble = ({ message }: { message: Message }) => {
)} {hasFunctionCall && message.function_call && ( -
-
+
+
Function Call:
-
-
+
+
{message.function_call.name}
-
+
{message.function_call.arguments}
diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index d44d277c..918a3447 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -85,13 +85,13 @@ export const Row = observer( {/* Expanded Content */} {isExpanded && (
-
+
{/* Left Column - Chat Interface */} -
+

Conversation ({row.messages.length} messages)

-
+
{row.messages.map((message, msgIndex) => ( ))} From 81fc0fce937d3b234cdb80630175f5571fb88d43 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:35:44 -0700 Subject: [PATCH 33/54] use table --- vite-app/src/components/Dashboard.tsx | 94 +++--- vite-app/src/components/Row.tsx | 397 +++++++++++++------------- 2 files changed, 263 insertions(+), 228 deletions(-) diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index fedcdd40..8d33c917 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -53,27 +53,36 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => {

Dataset Summary

-
-
- Total Rows:{" "} - {state.dataset.length} -
-
- Avg Score:{" "} - {state.dataset.length > 0 - ? ( - state.dataset.reduce( - (sum, row) => sum + (row.evaluation_result?.score || 0), - 0 - ) / state.dataset.length - ).toFixed(3) - : "N/A"} -
-
- Total Messages:{" "} - {state.dataset.reduce((sum, row) => sum + row.messages.length, 0)} -
-
+ + + + + + + + +
+ Total Rows:{" "} + {state.dataset.length} + + Avg Score:{" "} + {state.dataset.length > 0 + ? ( + state.dataset.reduce( + (sum, row) => sum + (row.evaluation_result?.score || 0), + 0 + ) / state.dataset.length + ).toFixed(3) + : "N/A"} + + + Total Messages: + {" "} + {state.dataset.reduce( + (sum, row) => sum + row.messages.length, + 0 + )} +
{/* Show empty state or main table */} @@ -81,22 +90,35 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => { ) : (
- {/* Table Header */} -
-
-
Row ID
-
Model
-
Score
-
Messages
-
-
+ + {/* Table Header */} + + + + + + + + + - {/* Table Rows */} -
- {state.dataset.map((row, index) => ( - - ))} -
+ {/* Table Body */} + + {state.dataset.map((row, index) => ( + + ))} + +
+ {/* Expand/Collapse column */} + + Row ID + + Model + + Score + + Messages +
)}
diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 918a3447..59213dfd 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -11,13 +11,14 @@ export const Row = observer( const toggleExpanded = () => setIsExpanded(!isExpanded); return ( -
- {/* Collapsed Row - Shows Metadata */} -
+ {/* Main Table Row */} + -
+ {/* Expand/Collapse Icon */} + {isExpanded ? ( )} -
-
-
- ID:{" "} - {row.input_metadata.row_id} -
-
- Model:{" "} - - {row.input_metadata.completion_params?.model || "N/A"} - -
-
- Score:{" "} - = 0.8 - ? "text-green-700" - : row.evaluation_result.score >= 0.6 - ? "text-yellow-700" - : "text-red-700" - : "text-gray-500" - }`} - > - {row.evaluation_result?.score?.toFixed(3) || "N/A"} - -
-
- Messages:{" "} - {row.messages.length} -
-
-
+ - {/* Expanded Content */} - {isExpanded && ( -
-
- {/* Left Column - Chat Interface */} -
-

- Conversation ({row.messages.length} messages) -

-
- {row.messages.map((message, msgIndex) => ( - - ))} -
-
+ {/* Row ID */} + + ID:{" "} + + {row.input_metadata.row_id} + + - {/* Right Column - Metadata */} -
-

- Metadata -

+ {/* Model */} + + Model:{" "} + + {row.input_metadata.completion_params?.model || "N/A"} + + - {/* Evaluation Result - Most Important */} - {row.evaluation_result && ( -
-
- Evaluation Result -
-
-
-
- - Score: - {" "} - = 0.8 - ? "text-green-700" - : row.evaluation_result.score >= 0.6 - ? "text-yellow-700" - : "text-red-700" - }`} - > - {row.evaluation_result.score} - -
-
- - Valid: - {" "} - - {row.evaluation_result.is_score_valid - ? "Yes" - : "No"} - -
-
- {row.evaluation_result.reason && ( -
- - Reason: - {" "} - - {row.evaluation_result.reason} - -
- )} - {row.evaluation_result.metrics && - Object.keys(row.evaluation_result.metrics).length > - 0 && ( -
- - Metrics: - -
-                              {JSON.stringify(
-                                row.evaluation_result.metrics,
-                                null,
-                                1
-                              )}
-                            
-
- )} -
-
- )} + {/* Score */} + + Score:{" "} + = 0.8 + ? "text-green-700" + : row.evaluation_result.score >= 0.6 + ? "text-yellow-700" + : "text-red-700" + : "text-gray-500" + }`} + > + {row.evaluation_result?.score?.toFixed(3) || "N/A"} + + - {/* Ground Truth - Secondary Importance */} - {row.ground_truth && ( -
-
- Ground Truth -
-
-
- {row.ground_truth} -
+ {/* Messages */} + + Messages:{" "} + {row.messages.length} + + + + {/* Expanded Content Row */} + {isExpanded && ( + + +
+
+ {/* Left Column - Chat Interface */} +
+

+ Conversation ({row.messages.length} messages) +

+
+ {row.messages.map((message, msgIndex) => ( + + ))}
- )} - {/* Usage Stats - Compact */} - {row.usage && ( -
-
- Token Usage -
-
-
-
- - Prompt: - {" "} - - {row.usage.prompt_tokens} - + {/* Right Column - Metadata */} +
+

+ Metadata +

+ + {/* Evaluation Result - Most Important */} + {row.evaluation_result && ( +
+
+ Evaluation Result +
+
+
+
+ + Score: + {" "} + = 0.8 + ? "text-green-700" + : row.evaluation_result.score >= 0.6 + ? "text-yellow-700" + : "text-red-700" + }`} + > + {row.evaluation_result.score} + +
+
+ + Valid: + {" "} + + {row.evaluation_result.is_score_valid + ? "Yes" + : "No"} + +
+
+ {row.evaluation_result.reason && ( +
+ + Reason: + {" "} + + {row.evaluation_result.reason} + +
+ )} + {row.evaluation_result.metrics && + Object.keys(row.evaluation_result.metrics).length > + 0 && ( +
+ + Metrics: + +
+                                  {JSON.stringify(
+                                    row.evaluation_result.metrics,
+                                    null,
+                                    1
+                                  )}
+                                
+
+ )}
-
- - Completion: - {" "} - - {row.usage.completion_tokens} - +
+ )} + + {/* Ground Truth - Secondary Importance */} + {row.ground_truth && ( +
+
+ Ground Truth +
+
+
+ {row.ground_truth} +
-
- - Total: - {" "} - - {row.usage.total_tokens} - +
+ )} + + {/* Usage Stats - Compact */} + {row.usage && ( +
+
+ Token Usage +
+
+
+
+ + Prompt: + {" "} + + {row.usage.prompt_tokens} + +
+
+ + Completion: + {" "} + + {row.usage.completion_tokens} + +
+
+ + Total: + {" "} + + {row.usage.total_tokens} + +
+
-
-
- )} + )} - {/* Input Metadata - Less Important */} - + {/* Input Metadata - Less Important */} + - {/* Tools - Least Important */} - {row.tools && row.tools.length > 0 && ( -
-
- Available Tools -
-
-
-                        {JSON.stringify(row.tools, null, 1)}
-                      
-
+ {/* Tools - Least Important */} + {row.tools && row.tools.length > 0 && ( +
+
+ Available Tools +
+
+
+                            {JSON.stringify(row.tools, null, 1)}
+                          
+
+
+ )}
- )} +
-
-
+ + )} -
+ ); } ); From d87da9d6cd58be44290a62e01612728062399033 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:36:20 -0700 Subject: [PATCH 34/54] refactor Dashboard component to simplify dataset summary display by replacing table with div elements --- vite-app/src/components/Dashboard.tsx | 34 ++++----------------------- 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index 8d33c917..98450e05 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -53,36 +53,10 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => {

Dataset Summary

- - - - - - - - -
- Total Rows:{" "} - {state.dataset.length} - - Avg Score:{" "} - {state.dataset.length > 0 - ? ( - state.dataset.reduce( - (sum, row) => sum + (row.evaluation_result?.score || 0), - 0 - ) / state.dataset.length - ).toFixed(3) - : "N/A"} - - - Total Messages: - {" "} - {state.dataset.reduce( - (sum, row) => sum + row.messages.length, - 0 - )} -
+
+ Total Rows:{" "} + {state.dataset.length} +
{/* Show empty state or main table */} From 242a39e75ab4dd4540f4dec48f09ffd3a9aa4249 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:37:07 -0700 Subject: [PATCH 35/54] log for debugging --- vite-app/src/App.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 9aaa450a..08c86110 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -40,6 +40,7 @@ const App = observer(() => { const rows: EvaluationRow[] = update.logs.map((log) => { return EvaluationRowSchema.parse(JSON.parse(log)); }); + console.log(rows); state.setDataset(rows); } } catch (error) { From ae5e4aebb15004c688e9389f40a0b0bedac9e415 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:42:53 -0700 Subject: [PATCH 36/54] refactor Row component to replace MessageBubble with ChatInterface and simplify message display --- vite-app/src/components/ChatInterface.tsx | 140 ++++++++++++++++++++++ vite-app/src/components/Row.tsx | 21 +--- 2 files changed, 144 insertions(+), 17 deletions(-) create mode 100644 vite-app/src/components/ChatInterface.tsx diff --git a/vite-app/src/components/ChatInterface.tsx b/vite-app/src/components/ChatInterface.tsx new file mode 100644 index 00000000..8d9e26ae --- /dev/null +++ b/vite-app/src/components/ChatInterface.tsx @@ -0,0 +1,140 @@ +import { useState, useRef, useEffect } from "react"; +import type { Message } from "../types/eval-protocol"; +import { MessageBubble } from "./MessageBubble"; + +interface ChatInterfaceProps { + messages: Message[]; +} + +export const ChatInterface = ({ messages }: ChatInterfaceProps) => { + const [chatWidth, setChatWidth] = useState(600); // Default width in pixels + const [chatHeight, setChatHeight] = useState(512); // Default height in pixels (32rem = 512px) + const [isResizingWidth, setIsResizingWidth] = useState(false); + const [isResizingHeight, setIsResizingHeight] = useState(false); + const [initialWidth, setInitialWidth] = useState(0); + const [initialHeight, setInitialHeight] = useState(0); + const [initialMouseX, setInitialMouseX] = useState(0); + const [initialMouseY, setInitialMouseY] = useState(0); + const chatContainerRef = useRef(null); + const resizeHandleRef = useRef(null); + const heightResizeHandleRef = useRef(null); + + // Handle horizontal resizing + useEffect(() => { + const handleMouseMove = (e: MouseEvent) => { + if (isResizingWidth) { + e.preventDefault(); + const deltaX = e.clientX - initialMouseX; + const newWidth = initialWidth + deltaX; + setChatWidth(Math.max(300, Math.min(1200, newWidth))); // Min 300px, max 1200px + } + }; + + const handleMouseUp = () => { + setIsResizingWidth(false); + }; + + if (isResizingWidth) { + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + } + + return () => { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + }; + }, [isResizingWidth, initialMouseX, initialWidth]); + + // Handle vertical resizing + useEffect(() => { + const handleMouseMove = (e: MouseEvent) => { + if (isResizingHeight) { + e.preventDefault(); + const deltaY = e.clientY - initialMouseY; + const newHeight = initialHeight + deltaY; + setChatHeight(Math.max(200, Math.min(800, newHeight))); // Min 200px, max 800px + } + }; + + const handleMouseUp = () => { + setIsResizingHeight(false); + }; + + if (isResizingHeight) { + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + } + + return () => { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + }; + }, [isResizingHeight, initialMouseY, initialHeight]); + + const startWidthResize = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setInitialMouseX(e.clientX); + setInitialWidth(chatWidth); + setIsResizingWidth(true); + }; + + const startHeightResize = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setInitialMouseY(e.clientY); + setInitialHeight(chatHeight); + setIsResizingHeight(true); + }; + + const startCornerResize = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setInitialMouseX(e.clientX); + setInitialMouseY(e.clientY); + setInitialWidth(chatWidth); + setInitialHeight(chatHeight); + setIsResizingWidth(true); + setIsResizingHeight(true); + }; + + return ( +
+
+ {messages.map((message, msgIndex) => ( + + ))} +
+ + {/* Horizontal resize handle */} +
e.preventDefault()} + /> + + {/* Vertical resize handle */} +
e.preventDefault()} + /> + + {/* Corner resize handle */} +
e.preventDefault()} + /> +
+ ); +}; diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 59213dfd..4cd60279 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -1,7 +1,7 @@ import { observer } from "mobx-react"; import { useState } from "react"; import type { EvaluationRow } from "../types/eval-protocol"; -import { MessageBubble } from "./MessageBubble"; +import { ChatInterface } from "./ChatInterface"; import { MetadataSection } from "./MetadataSection"; export const Row = observer( @@ -52,7 +52,6 @@ export const Row = observer( {/* Row ID */} - ID:{" "} {row.input_metadata.row_id} @@ -60,7 +59,6 @@ export const Row = observer( {/* Model */} - Model:{" "} {row.input_metadata.completion_params?.model || "N/A"} @@ -68,7 +66,6 @@ export const Row = observer( {/* Score */} - Score:{" "} - Messages:{" "} {row.messages.length} @@ -96,21 +92,12 @@ export const Row = observer(
-
+
{/* Left Column - Chat Interface */} -
-

- Conversation ({row.messages.length} messages) -

-
- {row.messages.map((message, msgIndex) => ( - - ))} -
-
+ {/* Right Column - Metadata */} -
+

Metadata

From 6bcd294c649fccad1b85b74fe4d237055339ce55 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:48:26 -0700 Subject: [PATCH 37/54] Add logo image and update App component header --- vite-app/src/App.tsx | 5 ++--- vite-app/src/assets/logo-light.png | Bin 0 -> 21694 bytes vite-app/src/typings.d.ts | 7 ++++++- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 vite-app/src/assets/logo-light.png diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 08c86110..074b9ea1 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -6,6 +6,7 @@ import StatusIndicator from "./components/StatusIndicator"; import { EvaluationRowSchema, type EvaluationRow } from "./types/eval-protocol"; import { WebSocketServerMessageSchema } from "./types/websocket"; import { GlobalState } from "./GlobalState"; +import logoLight from "./assets/logo-light.png"; export const state = new GlobalState(); @@ -119,9 +120,7 @@ const App = observer(() => {
-

- Eval Protocol Logs -

+ Eval Protocol
diff --git a/vite-app/src/assets/logo-light.png b/vite-app/src/assets/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..947607ec5bac393ce33f19c687c283dca3c4d471 GIT binary patch literal 21694 zcmeEt`8$+r{P05*QCd!xD5nKwU&;~+~Q4B446e4laZ{r&~-_5SkCb#;xNx$n>Yxj*~%ywTQFJ$3TpNdN#&sXcn23joXl z06_PK={WerE9S2h@Qc~wk%>0|T#=>yqf<$cum&H}dF!ew10_8?i{O74?C(9f2LRfW?8R(e)G5Zd0Q3#e_ja-Vk|k|jXZgDw$b>5 zX*t(R2Hn5!2(Y>F75!Ln!z1>+dzuhhUu_IIQV15w0`3`sJv;k7!q>#DKD!;PV{q;S z3pk$et@pfNjGauSDa<67JGg^rS8;H;#dj-twuijd<3xyFDH*ruHuSTrc zj2uY^FGu^dyz1`DoS=@M*cc#Yn-z`p>Qx%J6{80jGa*!`gt5v2Ld|3AMcm;63--Sa z;Er2oH3j28KorPhGhNXc-<@EOFI>-jQY2qA;*vZ-kO?96a${$CgR|Iv?}#$4n#$2S z{!x;xWw@)tym+Nqw1DBi-&%|fI5aOtyEIUKlCky%kLdYl9AJ`Wmzq`PU9TdJ_WeF|)8D|56P|^zrlEpNc5*3!V?;ZT#!^I)|^8f&$0{hB5^M5#`FP&o`62YB-zy4! zXtt{5chpk|JruqK+4tDetUG<;_Y%SKDv!RQ!wz)F%8JwWKhJ!n0G`%vuS=psGrw0TF;;th z9_wJ4@(T$#2M|3rzpb$yMpy;j{r$U#($HxEW_~(-b)`R7J=S0-yLfc&Y1KM9?dPlwd;e|926+JCF92{|&p$UbXJ! zl_b>j$KuSH&t>d+sp}^;LiX-){QiBoQYb7o+*-FD`0;Y3&8j3AR0an1--iqrJ&uTN zJ|Lhe!3?p$Xhml+TMWei<{!|ii6;f9v8&Ymu&uU8x=aH@3I?KKOc%kGtxT@rK|F$->utk6WjcAlS>UAvpL+VMK$0VDSjIu5|%8#K`eg> zYgI#UG_hHlD*Di6!i%~tt

m_-TOz&6T@FdmrQE>uC55s>~ZgY_we^2Yt)4&lS2Nzco3un4&L>)W;bY+kq(ge3mr2`-l6k;4h9<^%Qd;DQ%!@ zi}yc3p`?`b!*+Ku$buVBaqwS2-a=2dANtq8>{DOR7$1Gg7!d_&K0ceh3V_ByH^?m6 z)4zXl`7Y3^RylG?l?-T%2;+WR450d7qmFvHzEh#oy$x2o71@N}%ZJ0Q3^cuRxPh?$ zeUwn?(YO3f2Li~B{?Ys5Jp&L?)9zycO{@OMC2D_SXe)UHpj4_JiM$CsXV;+O^z49j`+i z2YLcFS2&s*&AV3qT&84UAyEcW>U0i3tYf(qclLhoYpLP^PmRO@L7gsJI)AXK4bL8N zf=K}$F$03FMZcGtV|AkKv>1Su@_Nsi$A2W$S=JPq=LLe5G%K$E1N1gex0jJDbEuX{ zaUbZ-jy@$*4pq8xzu5=?!_C>SC3*nC-}sw2ASR5!ik9pjMmwL?{3B|BukxSA;6~=D zKlT`~7I^hXl7P_kGyi|X|C0CrCY2y#W=qw5)qS9%fgjWIM`qqyRW)ko{-4qRjVe9x z%dul=Fs$5+0VwG9jA|>H?r~hw3LzjU7lG@O3G*!8^~&{=0bZB+wWs0uZ18{)o^ z08k}ydaPuOi`^AF6PO=^1zHAtmbP_?eX5|yg?2Iv&;(uFutt-2ekUj-`AWg2-K%)o zwS9>{Snc;l@VB=DmUyP4^IO_3sXn6dc2fO6fuDRDeJzK! z!{a7+8``&A$I|xT;x*deY*+pRmN*10$jo_r1nB;6Km(WT3qIXCGP8)^XAbp4nQk;4 zu@Z9cKRv6qEq9wZT7>?+Xl!G;o@z~SJMu99U1GSxUW#XfKa+-rMurFN7{FzsnCS+M zV!w}zjtlMEp^-$~=07~k0H^B$M`OQbe4Tp0(yxm4_J*@}( z-8iE?qr<5-^N!dU-dVPcB#hZyhu=!@{;mw#c$Uic5wY(=tqndM;$^>k8ARa+c4_LxW}&;7AyMJwtO%q0F);TcYFMsvqtjZaD8*p||$-`vu%+ z0C$Jy{AFlMde3Xp`=`8MLiY zAY;q?&^u-_>!TrubwL}viZn(imAMftX#qmZYfwW@thM8C>$rm=RYfRUM>RI89433u8r1Klurn(u9SMBBSl)nP|}v}44ZCOMopr>v?|zytcPHdZCW8XLzuf;A;K9U~g!*O^7pj|>)%oK*mr+$#K=_%#blR?{ z*S3UEVi2j^q!z6sh$p z8^*iG3rs+Hn(TWO8(K)kx(ADbD?FG5xCC!*Irdl5Wg1$57kvyesBn9@+vFfMpNAIY zwd8I(%4BZp0|f);L3Bi)$TAm<%N+Jz+v`mHvw(|U-LH>5J{BOtglIcJS`SdB=j{Uy zkg7C|OvIOtVI8sE#{0($bn2uhKyG?CwyG(er%7cY&FpwwDE&Mp>6&~ZbhN+)4C#%o zr!m~RzjYnlTvAX)RMTPz9aW%V4;rOVyZrWOdm5ikW9u90Lv2ohtW(Y*o-&hTg0X7`;5FDg5-9Lf7|txFTs`kmMVB5r$Zspop`BXIwCdP%w{v!*x@>CV$;4fmGkE2m2|)H2JYeAwe*1wkyXBslq>uC^p9&UD|UuZ zC^5l2riE(A41IcivIOv>wmau%ahgGg|NdsV{LX};^YqF+a@vy{6LQoooTRYVgxn63 zIA7}0L@_FBUp_3>Iz)P=%uJ3u6;?Msyu5Ghvavh9XzMsW14}I(WAoaQkXtrOtaLWs zBk#k6>rB6u-~>vcJCCj9xd(!FNK4~`Nv1mwpPsfy?Nzfq zh8EOsrn390>CXEJJ&YARe5v2g#jgCYY>q41GxY>r& zn-nzc+96Rfh!Y4s>B?`^d38vkA+=yEy!(^6qgY0;yHxqUT@U{=0F#ruG@3~7g0+j< z*66`FR1FJv-3?p`#0Gh3U{-wO#+0<#Rk2IjOS|cgOOl(o?j}1C>gGOt_F-MA`P}lw z!3aYb7un+7kSYS<>IfCy?pxeZS2VR_LdUDx@D0<0s7b}Et9Kl3hjp*%o~Cwhj2oh)8>_|k-s~3_rOeR`4@bqdQmG|L^UE8R zF?&(>odblcnT1`YH$=P#6Ul%PX!6XzQ53Ca%?`IY0!V0zdGqdG+ljc~)kBcVD~gAb z0FOSxm){5bs#CIm+nk8dH_f{=FJL^!RVvzsGcn~oAE-njqil^-pZQGLIB|}-vBP8r zBCHQJ0MP<{L9*4s=V+xL zvFTV2CB~I!wP&5bNF`T`Zi)2>_hT4(gJ^*jqGW7GYQ?&*sh&0V`Rx2*@8S?pTo>zG z80}-D-r4%Zta!&J)1Mo@RgMSsN zl8VSl*(w2Ezdibb2SN?71`WzX&kXVakI$IKaQyfBZU!tKCYSm;;3ogm&}!5 zhHb1=-$ain^fT2Gv=X(V+oO*u#DQ4!9S}ke#3Kx&6DXbCZM>YOid;OrTYhz zXA7W2@6}i7YDHR0k{XbBHO?!1p``Pg7fSL2|0@8@T!ZW&j!vvC&P3Yd!dZf{=;#nT>Epe4zrQv6o)j-&Uu!PqU{ z|F&z=dav6Cp45%^%Nb*l&nBHphku&2=U7uqu zFsQ5f$#XA&XD4OHn`daxb?NG@HSrF)qLbbBsU61KHue7KFULU7l(-H0hJbvvy%9N=H(1Xzm41D&X5b^2`f8CLaB*SJ!JeiD)P4>KR}qgK z;OH+NW1HT4X_{8rNqJiPdM3?aVb)2SS`u|Py3O9?t2w5v>sp)-mqobeuzYX+q|xW) zV@B(VA@E(WK6Tmq=s*%fTwZP9ZXLeZsz%1k-=c@#q~62AVp)M<`1rjM&m?=}q_V%^ z0ke0t*?omyS%68#_sJh~T##ezYjwdU7CrRWqD|0g0h2HttoDO|f{roAw!hlcHt?>=Z9=NG$fsr8k;4H@9+%i-M~yIC ztvDk+%u4jv;b@hp@75EY_WnrgIjKo z1=%g}`vX>`UJh22Q;FiCZyP^KE5tiKc@|HQvmkCiKb?;imzZR#ArK`s?4C&QFtzx& z3Lc;&HA}wR*=(JVcsQ0PT6nLexohUK14rj{^R;frXW$?8Os3;ni+;*YV?)s0t~A|{rB9}PCGqoyDv$Zq z!1($j?*#Hn+AS=Hq6`Z#;4kHx)Ti9xjU3A&N2xWmnS4Dh0bq);Wtmd#7TZHra!xfY z4Tj`-{i1s~r>;{Yx-x$)mQ3F@!!( zdsdLC-!OVieylI|pgkPU>s^6-YTdU|*12J2d16W&z}QI*F0?}98SPXjNk$wjqh%tg zEfWgM{d40L*jvmgD??Y?KA77Yv>FLW7*%Q&MoG!hctPFmApk9MB9}z|_3j;+J@(sb#f{kqcQi+&WpG#fWZ7jG^; zpDLz^ir3|w=fTYG7O7lJZtzs5WNF^1ji?DJtlyxIe-$jrq0jt~}i_^@E*jMZg+Q z%PoiVprghQ0tIIb`8k{vD}$1$3s;l$EBmybGy@7r9=hD>1@~tW*v07^DWk$yGZ_-g znO|#1i1yd+hz&V*WL~!9Lht|WI>rz?m&HCC+{zDm2nMG>sB7TetyKG;@?CStF-eMC zUvZ?hE{kOpqXjT}JH}RAv?x--w3z*@_RGi{U#`=AAp3Cb%s;M!h$)NAIm$e$VCH9j zGc+$Ny(U4+-T{{}ZpSuHOwsl=!uDC~rKi0`e9&p=DX{W}y^2msss6sYl0H;ZG{3I7t? zjC#_Y7Q5b}Cs0qnt_$6v&rv?bo}bMKouBS;h-L?ko3R#6Top8HrN%8KYCBQuS?O}i ze_AC3`<-*DdSr%3mX4^hIZMa)5X=yPPz#4ChZ@N`Da_wr6<}f?)1U3I6wl5PJ{bkp zC;8KD-lw+XhoaqpB!4F>?WLGWDW`KFx z+CegYR*-T$`$!n5h*El`cuifjWR@%jcuZn}xZBlOzJ8OC5I^L0Ih0VB?8|K!Z%)`D0nD(v@H_a>~YpqFZyg1U2HEcMO_w>VGCgf zV{N)jO?dbW!AS;_KBkpx3HJ@mF-x4vORtvWryI@{B`w@9R{xR5!ZFbP)VN5RWk#@F z9L6`<7slR{q9lV=xyK_K=;Bf>7ibaK}uUzv>#spN|1kz`9K#m=+eiZ}Gb-1J5mOlFqy z=#9qeWye2!pyB&(Bm$9peD$!k+zq%OuSV^>`dwj0LW^LDTN&1o6@^|Myvkq3vVofM zE%@*rGs~I%?!Jk`r7_HD&@q=#Yzw-FI0{lc<^9yG%lw4(D_ciL1nX5Ek5n?dZo85-zJq*Xe>`=5bcTz(%IT*Wk0{lcYdRZBO3D{eu7NE+ z{Xmw?({;^3&ktE(Tr;NN9_Kh~MEjYH$K_nPQz=~%LRYYoejWl_i=U<^lj8P%Ku-@1 zMYUrbGp6p8F9jIVs$!Gs8A1CGPm{np&heyMd>W;B!d|3}yxM(>+^3o(n-Awg9jJLF zb0@X2%VPVmAhO?p!Uywl4nB_!x1Nkt*G92(*wbCreiXyD;{8 zj0@BCQO=%KIB~ncoz11Oz2$OOu2_NsJVEh?9GXAtGrE=ks4J4#Z`bCXAHE;?bPOtvq1sEaOSjHoS3Sdb2!F z<*TI4x>NYhgk(dxf@`jrd*SISNSz$+SEcbjeM!+{voGB{%C2)$pD-S!)m>%Zr>`4v zNBo5B%)6{e)w5C;>QDrPwCXloUR={+v^37B#B3JQC~PU_9pKkPJ?wF3Pqz1Wlg`2# z#y=4kKswu?U-3t`4aYSbV(2It{WlQ(#SzSjT$raur=~XLSZ=%e(C!megFfp37RA2q zx8eA#>H>CWYPV^HHS}IsHoBSwW{$tU_Ws1?JeSGPH-Wf zd@FvnA`|aMR;YFNl`9(DdVtY^mF+8l7hC9a`{8>2v%+_`=-L&jjB;Zxcic?#2Mm+I zlP-6NZ=B-Z;JnlYS~+imEQ4km+nP8y$d*Ixgfw@?tb+P|E9a+i^ZWYv)cRNya*i<* zdb-A8t#fhW&~Te~+;mPnD~BQ{=NgF$xZbTtSDP_|lDUUwz3m9=ojzlF_n<_0POJjm zeG<%)`>v8iqXw$W*v354q>CIkxeAk;K2YV<#!_wOkoGo*vNO#0#JsnhWT=ZXd%@;& zUSL78$@EeTso}Y95gj&`b;AL^ovlT&E%zc>9KT3Q=QM^b@~>jz_e?h(ERSnfkj922n``Ug)R7-1YGduoG2VFG>pI z>)dkVkPnN5o-VB#%8tB75GBfzL`t@owu4UZj4wzjxMNW@wTifHj%{pH+Za--&L}P4 zGPTgk7H^L>Wi?)rHxDR{W%Y(c;uTlDOHJ9g%}#B*Emy2t?`@2KGvQ6mZ^B_EOD2ZW zFbbr1W)!>xyVeq$}(q4U|D4XErRF;<5+KMp&hAQykkd{cZy}aQ7afH+#4cwRqc8H9#@$tsQn*D^k@YKPrKWTh>85*Svd!h*E_&kw#vi4>m5(cXZ8?@Sb-fK;q$Pj)(wxJdEWUJ3JoUBoi>~#Z9VCul)_9x+#B-!k zR!d%;S8ygH1@m-v!Yj=tZTM|KRJ+4#k8{70)x{UB4u=p}cZi{?_@aQH;T{%k$rw79 zmJ=+p5(Q>(?OR;@5!HLEL@A9tl;Obqbytxfq$!;_M&W)~t(jxLB>vOm2CBn^=}FIc z#(Wi`LE$|V>IQ#H2PXevt>*ELk)G@K5jIy{lBMI{WI{)^1v7o<{A<06Z>YXOnMxpy^NO90*$VIk zN?44V;7ji&p~@f0-&G4eyGAo?) zK6R!i;v>7926|Pp3s#jG<<5?rxC-Wgb2@k5JOoVxLRXNF8gjVyE~bbt-Vm$f#vMXl z5j&<-Ij%vdM^z=sX*DGv$F2^gKD!~mVJc)4q9{UQ(5s{Of4@iTlmw^L`%PLta5XrQ zUs5$m&O%j~QLeiRhr7ltnTQPheL0UI))c)h=}JTW@Zo6P36j))pqaL^GUc?1uVeni z1vv2(#x;8S&R1FT^|qfsu11`isgh&|>#7oMS4li|u6m45{I9qC3!j}61~YWky-{0L zUL$q#sC(CXJ8tO0qtP3x^-bAc=ajITlKQs_OzM)IXJ413aCDgtFE)J>5AYd*nDFyw zXvsGy@!AE9&LORs1*#-(GA#GxeH;xUWPIBd^cB7@QtxuOQI0z!9k9B&BtJizWxlhz z(ubLLLc2|926nav%jH#UFPS6nR5GC)Go<6*@rf|7?!bsCqz;}ABY#kXfC%;&P}@x`x%Ik-B^`L6M&F}&M7q-LwGpU`qy z6`>3#hX3j{5-fVVX~MI3{70kLKPU}?OgG=Jesx*Lj5}M7_I;?vK`g5(VDYRsf8V@# z`Jk~tGD}*EdYMf-^4!TgJ#GXASF28wza9HAh5AX$_eH98%H8YS+!2rjiLaa-EOUy;m94U#Y_?U=?72f|P;I4{q>LCVp2JHIYMZh_M6eB@m zmtJW=ICuRhhu9p_?*xp+Ahu_Wr`M4GVm)pbu4NyT;F$fqPeDl}<6XsCgU2~1uYr^C zP*xL+vOw~~;m=|11FF5@@*XG3SsHvr!N112uV|dv|9wIF5J11hfevdLh5^ z!x)EB++Uk1JTJnv`5jAGO=O-bPf!h(+A5;To)2AGm|5sFZLD^Ku20D(>S35>7g9>? z3fy|__v=w-F9*w!oTnbumtU&vfuqzR48~w4*j_ob0ft8qr*P^qn>U%mEQ(}!(&lW%~I@RrR>of z&RJTta*fh?{U`LC=}=`Fw2e72zQv&oi*iCeH3+!4(VL)d2!oTeVtKxUYF5(7Hs#nvc^ zT!nUthgt}7m3FyDvgf;Yb%bf2+XiQ(4%nH?d>*oI&s&(nAg)=Zr9Ke!kJXZBl8jV| zT7=5zjk{2M7l!O-5v~(dr(LK+t%6&a_BSW1)juHbJ zG^pOk8#3IJ^Mh?q_K0na%)D3+%z(IJQMMW6cb>w7t(5zGj|=(0-W-YMjbaZsbpXy> zDA91q4J`O-?rMS6TH`G`>k0iQPFg0<dYSy)Q+#PAp;!Z#!mh zmnkoDG!)*^Jy;gqGP5(c?4llPmEQSoPt75@Qw^XDblBTFciPW--k{YeX7H_^SJ}Th zd{F>TNJ~IYlqe@`;N4v=lt-?Q>=EyxMY$Q8Q>r_rt4;_fa@oiCu1gJAe%IAbbD}lc z1Uu@QHpU5nxRZN6STfBYe5(o4(7jW&9~^+|&*G!j!>|3-@L8~2q-w(6T$Q9~#zH-2 zT5up;eT^WUknA?_fxR`=HhnCBuZ`k#Ufndu)q=<-FmQRYE_$>S2jv-L6a<@b`itoY zZU?(0tK*@)fqbwc*Xe>mC(U+F+y}(Psq3NCn=IGh4rM{6L5emKrq$GeS6NbZ;7f|nPTVhJLcOEB_i>f5-}X~~k_+6>~!yuE8L@8L+q-b_sh7w}E|<`%iW>HVF%HEv>a9`*Qu`*l&@g#iDg zU_wTZ5BtTA2Lm}2=PBb9$P9Q%k!(`rR8B>kYet&^b4tEu=?TF9J>;dDh*>zr zF>Af;uW@gY{V1!``25Gz;1oxPE3XWcRp2G1VK~jvtdkrZeBU0zz`|}*z~Ow+e#7A= zcK>_G!Htj&?~Yo!UpKL=vCCEC&v4$gDuwg9`A{H~a#OVqevN<5tSV|~W>#1)&b#WA$pZ>o0_%hkkv z9=l4ZL5}LD%Gj2$2eh=~6_Q5Xf7plSmtuorBM z3Aa5=oVxvddUMSXNJ^1x7VN0qvSIC9T71+@sjTgU!aOH5E$Um^VI!vz2$#s_uh2y) z8q&2WuLomR)Gfk(;tr(KikcJDqj-ABttjic9r#Qt@POZQv3SO zB}JTeZ=rr4k-jC)wUCdwGAd$d{R@b&@tJIC^7V)xjMZ(oqp*GU1#fBL7}$MQJk3bz zk6HbB7j8aFwfc8PsgI%<^Y=NR!I1q`0d_OA3! zfX0}lU_kUh!_>W~7q!Ch@X>`>^M@P-G@2sQ(y;XuEJ3evBde~ z7C7qx6!gwH)Y$7GR#01D@IlmzE?Jb)gua{)g9S?P2LiHs5Q?Q1;frH6c4^<**U}rz zg~VZV9K-xnW``8e3j%oJ0N$B53wbfdr)ckXUE!159NyxwtNhOaSr#?L^eo*zp|i$x zp@VfpGiNsCC*RjAserv7Akz>GPhQ;C{5LL};0tdYQP?uEGoM@9HvL&}Ogu_X+Ti2( zYw>eH)VudgKnoq{S^(|J3Z-3TqPI}n*SQjQ(Rrkpcx9J=w9k^{tB-SZ)`ikGIet>F zKDep=4OY;#&N&?m6`@UpX4*l^%P=0g$!UThpL{_+HD-9;P+gC={>c0=ba6rIRm`|N z{O2tI@aObC0hIC4`UQBGWSe{CkKyXypveS(!L5L6q(DakJKbcx6YEZ+A9)xNxGa@X z7y{0q0Nu1P#!TPbr?|&RoD?|yQ(gKP9v`dOx2+=s&7avBBFO?SZK-Fs835~jG60x) zf-@=wV`@Y^ROUkZ91@r6XvEAmQhi4E_JD5=*fEXq z0h=Ulj6mp;Q{6{?fafJnbMk#KdjV(;06?Um$_pno(i}jn&}abN4*&)l#}l_KfxIVR zv!D-A`x$XukT#m9#Gpkx-Cxh8KxWF}K$uf04O;CaYf@a-BM5Goy~_Eq=$d>uYl-W6VApHVN|KYq$Z zuBRAV`!hgkEMAv+*$!j~MpgC=_J>u$6W-c1i1yhjkgld)AIYt1D$G9SHJv}I1;t$- z7k4b&eFS=@JPT;w1~_^VNH#V_P_@E)KsO2ev^v_F7))?u6rHmliS`PaU@R$RQ))Z9 z<#);Z#@W@s9x$_8$fVuUvPf`zj7-6s7UXTto}(91Wgm~WNCuP$R#J%u$D3S{<)5@h0s_*lHTDkukR6h)ght;b-!xy)){Z5?j)A@v6yV!f ze89B>my(rae745mASV!*6hIuZXW|ois>}m87_mh1w5q{8qR!r~&^C)<7kscaa+(_L z`dnt~yl>Gzd#bef0#J%{`n>Et5UNvWgUG+kmxS-@c4iKPA4E0$K~b`30dvw0^*_~!d^c+ckh0vk3V?@j4}tR?+c9iO3kpn z@j*^hm)eN%l->ekM2Q8x5WbQQsbCADy)Z4<05xSmji|@(B`WpCI5;Hnd1Feod9LmN zq=^Rz_4K^1d#N7Z{gm_e`3i+b(XBCG#opE7JP7RkUy6-h-HubTYW#B_#Bb6j*N*Dd zw-xtB1dr;~fVkl7ap&ZELAH2n-8woe%U?SaWtEib|FK_{9E_Wh{f&BrjNRcb_M+MsJ5wfZZJkzEsqt{`Yylv|IOR zlXG~DRe|H7-*3bR&mkWp=PDZ~SDQK|JR15;2Xa2my$QV-bBO^M4zKvz(3=q}+LrgC ze1#nWW)n(HWY(dGlo(C!z(@Zg@x{1p8SX74dZJru1&4bFjubur=sVC{=TRBp{W<=x z27Ji=oTT=Zj(X5aR6vQTx9S`w3x0m>(TkDkOTb>vs&S9509Cy(%u|!pacJ4`mr!&| z^+0p-vkcEvr!5)PhJmSE+AQ_Bdc%caFdI{txvfP_cyaQ`>{Oi7czzeQ=vDsxT>!CM zBT)4{3~98O2nPW=CX)Qo5(Bwl22h}$}I8s zGGhv_Md$|lqi`!^jN}%MBMwYij?YAIOqSoPaf@V)kBjaP2UBWtAE%H>j}(FE?%_&v zfKgwHkXU=t=|W^wfQiCFe?|xBm$C}(cyWs8zcM{OsvY>=En`h&*$;VWZ)#U#%H$DU zPPR^rG6PaTz>tjCenLP<2Lsc&mIzfX1^Th%vn?fiL(_;r@kO?7`tSGH6^>uOE4f8@ujq2FJYjtqdUfWy$HN5{ptit5Y|_$*Yp5}4t*n4;%z)j) znXSL+{o2oL7&1f$ja!*d08_2@B*F1G1T>>au18x1IXIskrfzO~F|tbg_IKl`LYlyc zv%BYuYTccrK%aVM+(88$58&{nO}^KHqf{~pVN`JZjL3mik_R)d?J%lDn6MdBgK%YF z?gT-TI>)6tA;f)xqb_4*6L$low_ai_9%t-=HqBUq($hqQGtx*m5qznQ>ef7uj3C@f z^8@E^IchYhHgV;`%Qa;MR?3&*nIZy6E0f{XzG_jhgtzJ({qHO)D`?xt(I|1sxZ3qF zz&$r(J{Nq$sMC0v;%LP(^i;K8=Pu2VVm@KG*Jmg}r3u#v0l|;p^gxGIV!n`xVrgvgJy&+(*M`U+2127?<*chJs-!oVLnh6<(s*!DeR4 zlQ{Z0z{FydsR4blAdMD&*y@_8ZSOIn{g|*V0(UO}p;%<`^TmI_!46^{rqu&1=l(D^ z;KhI?$)5qE#q>sn?|AZqDXjiK)#T$p&pVb9pCnTCW$r+zfu}Du3r$V3x4JYiwD^vxgmo?s8oXv>N42h72c??d#A?+b(zcqR>=X8@1lr05VZF+r1e$j$nsVGTKvmr|mm@Ko@i&yPb{^dFP zL!Gy_5E5kqp6G?H#{FoA!A1z>renSzsc0NFtxJ+*oO2MW%Y2oWc()H)!0J8gYCz@Ye!l`_iegcf zEvCL`#YA#^`N&mQ+3&k;@^H=uLwa9}a9crVwtXK*p+~R+73$#2^hj1J7=d=$2cCkv zWn{h8Wfp{uAQD>LB2f}249NJauEq~9JifU02mnU)-JY5z>6eUbaOHd5w|ps7r7;*E zOwR2uokzAwk|-ubLuJQe9yVHw@-7{)b%Uj012y%G(46+X!%2iO_U+AOd})9!!x-42 z-oTgYM+DdtGBne_)QP$>#wN)9(CdA#(3;&Gt!=g zTtOxF_ZYi)l8v2}R>M$I`9=jP52Qe5hZ=Ub!QS0YL&-T)!|+)eaXk5#u~D}3?j#n5 zTy;a1^IR5S6%;60z227e=`puDV{XNZ%siEHQx0QZyJW{@yx7iVI0Lz(B=3ca>9*7(;m~=0ZR=I6lT-rXR*hcGo}*cwCG=cD)tj07g7OcX6(Ke= zYxv@7aD-HjIjW<$AM?-McL3d^7EPq@EIXQ&j1_UsO>f&|Ov$C@ zpRx$Y?dqDqhis!03I#6kG3b-EPu&9@?$RwSv+V$?`=VtSva`wh2pK4DFM zRJ{7ReK(?-E3zqRn{0@n_88SB{wzr-p7_H)N8#cz^@ z8=7C#!ioGFs9bDWZOF$foE2Rw-TiJizz$)?6D9%2n&*8177(s=OS{?=A!7DB)9}mt zT!9-XSU%}Znt>Bn+g#f^PujB`)1nMi`L_{cmt+FYD%wU^I`?Ek)T<+dSOtzrG>v!p zZ#rh*8T1SfaTYm$e1nxG++x%xZONc=*9jDJ>qO1Ixz^xbD5pSt;A?0#y2T1p41H0h zpoq&Og$>3=+4r}ph_vaW>dUNn5Y^{i-r%lI7+DFd!g^2zFSyJ(nz@3#($xT=8L)NU zHV>DlfU(R#tTZ^b`%|kTwQN>_WHcqHo^){i$5BX)aZ2`e$M|L8JZA3jLt9}PWD!Z> z2k~zTAQ3wJ=AFu8k#xXtaRSG7BshA!&xda`uc`4i+?x7yL7{=wwncZ(CSy%M_y+FF zUw%Y)a;riVL6U?XoPAztGKq$dcEUd6+Kaxs2@boI*y8f2oe*vTq?mPGlyg^7`ZM&E zp>w_zol)Pk%JSj4i`88NU<-OJIm%wxa9L>ixEWaH2U?QixrYL7Byb@TEGHyCnDO81 zRPIsRwr7PF(uGzFOD+3^h?0b6^6j<80^s58<$)Z#4S|O8nG1Y;tdwc>NB1l z?Nrv0SKk1p3gahHg;mm++U^B`?^2lYi}4!i`(tUE3f zI9bZ@872u}zbhlr|G zs_6Yki~0F6P=Nz!_LVs8_~2h&$g*(G6+|n{DsB$Gwk|>{6vt5KFz3Jg+{wprwg}tEhRc!_t^R(m!BXB0x%g z6`kxk`U;ovBvsvGLDqhD3;Wd%?Y27i`RhUYiTy+A26JAV_9rxUTkt%s$d}i^atauZ zu4p0ak6tQTQ;R;s6&F}!W+T{{_pY30RT>6%GrJSyLZ6_s;Sr~|M2AQNtnpQjR(0Vb z$4(vjuw}4y9GkrUY&t2%@R%;J{_5E%?$JX9JR# zRE@+)8DdcZD6?)$#T^(g5L)D&^N2!bjr^BY9T9w2LybA7>8z=t^3~#|@Z1TJ`$e7R zKd-`u^=Bmg21_8(gV5`=fFkLok(7n);fTm-7bAq0W@z&zu(V>5_b%I~7G1$P7_osd zPfnnKjvaz3nC*1u)9#BH+~l%sNQorU1E!;oOb|kfb2}=uX8KBr%9il zM0@*tXkK}ewr{9N8;r2Z^c8%=sd}cJbw+wro4rk+>3Nw7!|}Yl7+XQJK6{?{iO%`F z?Av2H5cx!;5m%(heIfM_Q-+5RXoen{G%Xr?ld&Q$zqxt+^5W{=IF zHDRT=huh;jb=m#%^BY%QUfsHAChll^mRe#b0{1-` zIaJy;fBD3JBds@+b^T|r_siQ^pH&qyHwbXwWZQKYSZkyQ#`;y2kcLnVe;(0n;a?Yp zv~X8nUcEia5R18Z(fk3rNGI~%M^FH&1c$^_UrU6AqB;AebH9fFtrcS>3nsw%i$=j z=K}{-(U=k(D%wZBG;Y``9P3Y}N9QY)@~eUq$V6M6&+L4!gLz5{qvFH%@*U6K`*2YM zd?B#>b+FMt=ZLO%ANARruBNBNA8bDBYLf6eLaqBR!IL6VuFxS#Azd7@TqYV~6|6_XPmdLa}`aV%AC|ZL=t@$RtlQnS(lQ%lanQ;hd3;dRb zn__w+#q}RhHO%Ukh8gdCrPTvuNmcFFRWbQi3OLt1ls6qFc!pw-u_I|``N~y?*`>a- z$-w02Y8%8gT8Sw2M4)%|bXJs6v=oHznX_E>Nlk!QpytGN^URewiP36S=1U z?ZFYtRAwIrewMG$Y7K}?%9Jm~ZTWe#z(MkYFDDw=HkP}lGE&_izzQvvq=cWMFXlOY zn7T6<;c9Akhwej>@dNZ&7&MQA2#(HlVV;f|VV)KWOPU-}SSL9uL~5ooDs_xv^7WN^ zuYKV8zax!Z=m1~mvyq?2Dxw&v_iw~o@EFKiz!^kppyx|anTI3f1-~(`=7}d;cbZ?9 z4_6D@3Lig$HmHW__~6D?{S74`nK*KA_9nEv{gnVv_88v7Zo;S_TB=}=>v(x^#Wh;c zJRE8IKkc0PUy|7##~(G*(#Dq8)x5UdskAZNGD%|8YII1OoNOFQNyQDyEi;!838vDS zxtNZlRJi06)mU87#4Sy6a&keD$kEhNG&EFPLcs+!=YTNN{SWRB_wyTvvpwJQ@H~g_ z`F`Iam1#8_SV5)+ic^o9UQBM`#W}PLCzz2^YGp~OyIF6Ons^Ht&8jEtqZ_6|?Z$nd zx9)4tHQYlbRQHU4Tjy}-P=2S`55U7>X_!RJV8F9Zz~~ zudIv_eu%xcw}`=i-~CYNmuu-~6#w%8!Opn4^5li5sn4&y=?7sb;9&%RU^W{1Rqh$r z{J@x~wf`V13^$>uW1a3WV{NGVRnhAUDQ??DX?nssS8q>+V_8CRNK}5{ z6>bQyP&f&e+RIE`hEpFk1j~`l-Qi`1-^6a5d_|;rxDU;rkVYnW-WB%p-B-C=GeP9_ zQf^4suG5x7axG_Yqyil17~GZv)X=HHU1!kwQd*}?AoGifESF|mggmyvbP>2z1>#JD zVA2EeqBJtptIWs>(QF%K?48ZZyaWO%`t*jJXLgO%yUUPw`o@PZ!i|Xz?c1m%gmcS) zz3K*x3+@`&xhlrV;vD%%7`-YUZ)LxTf%C&h81XxRabAcc0wXM`M_LSnIVJ1Mf4G2_ zC~|da+;HCpL1;#TY0>Tbsjf252IW^MTitOSseH!%TC72y?+0IXqad= zF0p?@HJ)xS%IChXs$lV>*X<<{O~YQ|pDwYwk}lU?P&ib_Z49>S*TMxXPY4UOp;>AD z;q}&H#YX%DtgV9%($jdPzGG>uGa|6S7rLE+rMRD0QA5d zA6V8y3-8>AfA!e8^g)XcXK#ApwH@*rMTB-aNVD|rF{R2)pB-%}!0BT^u0owM(W|Z~ z!nn-iwb+%5!=vfmm@jv%f%>c9qN;tjU#Chwsp;<#N36e8Am+xm^LImY#GowMoMv(`CrSx;=yj<(hlG% zxl}-CGZ%A1xbr)?*5USd(7tqiyE_I@u}h9y2`|`ZY%-=s+DiZtx#qDl|2E^_6v|la z$-|AyaougwGo&^+e-VbC1=;(X+e=3-=6tB2n{{`J#d#Nx3(YG0(x1bZ3i#b`FogZa zSDnDAQU7;fM}Uwz{0#O+2s1bKW^=ha0z|7%kE z_fLRxr?2QcokZZ)fg&(~Wz*pLLjSBEXghY5|8==rz?Fur8h#3d)l+VBR`h?^$^SYM z=0`?IoCZAv4hiG4TEXg7<^yN3O3~}m;&l2y;4CFdoB&X?6N=7L0Or6)MaNN3h_f}I zY@*L^3AR!Xie86eJC^HFKoaoi(~BFh>Pk;_Xx_vu zuZTQ(wW0*zp6d3uqASRAsOA1<^+lmttqoZz*Mg|#VW^X*d=KRu-X_Z zgcfUgAmQ@T-(MpWUy#At@%1PIOy~n&z&KF}X-DiLFDho8FYRS^d=913K=k5@###mS zA4D*(<2u;i|Hf|J-1bjT#k7m!Sxik#jUgnuxF0z`chE@P1{ovs;S4a+r;#&A68)TctzN9D7jt}RQHlTHn zPB1}m{gA?srI`!G=?P$hT?&y81l2qvA)(TH%hNY&=YrH-V$-d+diq+|CW#s8X|<0( zlo&x)!`n%*GqIWqeB6_}!g-TPVK!+$F?&{)BeHRV>(^sZ>_k`8Y~UOMb7!*-1jBNUeSd zosfn*Q2Q_CX}(g2tjf`dbD|Zn9r}DBXH2`UR>m|-;H=D6V|H3sqN?{UhEJ4>qG`;m z#bxn`8k7bVGy&M38E0W?q3Az26v%zey9GFjil))+up3nRP7sHtQbC(1xXM?Yg#;UO z=FLuW2M>f&Fp(0;DCn%Mh@+Wy!5?k)?#aP@P&ppnGL?Y>dN1S#%CrYSY_)Q99-u(35s%U?g9Nujc53t2j>X%SGBa6tapI!>a zCJdMzV`#|SVJo94P_QrWil8CaLlLHz(=G~-7Rku&z?CY zrBC4X4#obw!ng39)@J(2-RH`fOb8x->N3@bLX^9<(1H zhll6%8Xr|p2y2M@(Dp%Xz*5P1dZ~WHoW& mY&?TJ$lwdnrW%_*Tp&aGd4r?JHkc?8GmyKRrz`6S_R6238UURD literal 0 HcmV?d00001 diff --git a/vite-app/src/typings.d.ts b/vite-app/src/typings.d.ts index 2cee4606..bb321822 100644 --- a/vite-app/src/typings.d.ts +++ b/vite-app/src/typings.d.ts @@ -1,4 +1,9 @@ declare module '*.css' { const content: Record; export default content; -} \ No newline at end of file +} + +declare module '*.png' { + const content: string; + export default content; +} From 6a0432631c0958638e7dfa3281f91521b167ae40 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:55:36 -0700 Subject: [PATCH 38/54] Update chat width calculation to set maximum width as 80% of container width --- vite-app/src/components/ChatInterface.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vite-app/src/components/ChatInterface.tsx b/vite-app/src/components/ChatInterface.tsx index 8d9e26ae..7725f96c 100644 --- a/vite-app/src/components/ChatInterface.tsx +++ b/vite-app/src/components/ChatInterface.tsx @@ -26,7 +26,14 @@ export const ChatInterface = ({ messages }: ChatInterfaceProps) => { e.preventDefault(); const deltaX = e.clientX - initialMouseX; const newWidth = initialWidth + deltaX; - setChatWidth(Math.max(300, Math.min(1200, newWidth))); // Min 300px, max 1200px + + // Calculate max width as 80% of container width + const containerWidth = + chatContainerRef.current?.parentElement?.clientWidth || + window.innerWidth; + const maxWidth = containerWidth * 0.8; + + setChatWidth(Math.max(300, Math.min(maxWidth, newWidth))); // Min 300px, max 80% of container } }; From 1159eae73c3b83a5094ae47f02c13696a79dc143 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 17:58:23 -0700 Subject: [PATCH 39/54] Refactor Row component to use MetadataSection for displaying Evaluation Result and Ground Truth, improving code readability and maintainability. --- vite-app/src/components/Row.tsx | 93 ++++----------------------------- 1 file changed, 10 insertions(+), 83 deletions(-) diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 4cd60279..130e8daf 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -102,90 +102,17 @@ export const Row = observer( Metadata - {/* Evaluation Result - Most Important */} - {row.evaluation_result && ( -

-
- Evaluation Result -
-
-
-
- - Score: - {" "} - = 0.8 - ? "text-green-700" - : row.evaluation_result.score >= 0.6 - ? "text-yellow-700" - : "text-red-700" - }`} - > - {row.evaluation_result.score} - -
-
- - Valid: - {" "} - - {row.evaluation_result.is_score_valid - ? "Yes" - : "No"} - -
-
- {row.evaluation_result.reason && ( -
- - Reason: - {" "} - - {row.evaluation_result.reason} - -
- )} - {row.evaluation_result.metrics && - Object.keys(row.evaluation_result.metrics).length > - 0 && ( -
- - Metrics: - -
-                                  {JSON.stringify(
-                                    row.evaluation_result.metrics,
-                                    null,
-                                    1
-                                  )}
-                                
-
- )} -
-
- )} + {/* Evaluation Result */} + - {/* Ground Truth - Secondary Importance */} - {row.ground_truth && ( -
-
- Ground Truth -
-
-
- {row.ground_truth} -
-
-
- )} + {/* Ground Truth */} + {/* Usage Stats - Compact */} {row.usage && ( From 6dca6e313cff5583519545251720236bcf0e9eab Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:04:21 -0700 Subject: [PATCH 40/54] first pass eval metadata --- eval_protocol/models.py | 15 +++++++++++++++ eval_protocol/pytest/evaluation_test.py | 18 +++++++++++++++--- vite-app/src/types/eval-protocol.ts | 11 ++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/eval_protocol/models.py b/eval_protocol/models.py index bdddb559..847dfc67 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -200,6 +200,17 @@ class InputMetadata(BaseModel): ) +class EvalMetadata(BaseModel): + """Metadata about the evaluation that was run.""" + + name: str = Field(..., description="Name of the evaluation") + description: Optional[str] = Field(None, description="Description of the evaluation") + version: str = Field( + ..., description="Version of the evaluation. By default, we will populate this with the current commit hash." + ) + status: Literal["running", "finished", "error"] = Field("running", description="Status of the evaluation") + + class EvaluationRow(BaseModel): """ Unified data structure for a single evaluation unit that contains messages, @@ -241,6 +252,10 @@ class EvaluationRow(BaseModel): created_at: datetime = Field(default_factory=datetime.now, description="The timestamp when the row was created.") + eval_metadata: Optional[EvalMetadata] = Field( + default=None, description="Metadata about the evaluation that was run." + ) + def is_trajectory_evaluation(self) -> bool: """ Returns True if this represents a trajectory evaluation (has step_outputs), diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index d72a83f1..f3db037f 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -1,11 +1,13 @@ import inspect from typing import Any, Callable, Dict, List, Optional -from eval_protocol.dataset_logger import default_logger -from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter import pytest -from eval_protocol.models import EvaluationRow +# Import versioneer for getting version information +import versioneer +from eval_protocol.dataset_logger import default_logger +from eval_protocol.models import EvalMetadata, EvaluationRow +from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter from eval_protocol.pytest.default_no_op_rollout_process import default_no_op_rollout_processor from eval_protocol.pytest.types import ( Dataset, @@ -255,7 +257,17 @@ def wrapper_body(**kwargs): ) all_results.extend(results) + # Create eval metadata with test function info and current commit hash + eval_metadata = EvalMetadata( + name=test_func.__name__, + description=test_func.__doc__, + version=versioneer.get_version(), + status="finished", + ) + + # Add metadata to all results before logging for r in all_results: + r.eval_metadata = eval_metadata default_logger.log(r) scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] diff --git a/vite-app/src/types/eval-protocol.ts b/vite-app/src/types/eval-protocol.ts index e08c9b7e..c0ebedde 100644 --- a/vite-app/src/types/eval-protocol.ts +++ b/vite-app/src/types/eval-protocol.ts @@ -74,6 +74,13 @@ export const CompletionUsageSchema = z.object({ total_tokens: z.number() }); +export const EvalMetadataSchema = z.object({ + name: z.string().describe('Name of the evaluation'), + description: z.string().optional().describe('Description of the evaluation'), + version: z.string().describe('Version of the evaluation. By default, we will populate this with the current commit hash.'), + status: z.enum(['running', 'finished', 'error']).default('running').describe('Status of the evaluation') +}); + export const EvaluationRowSchema = z.object({ messages: z.array(MessageSchema).describe('List of messages in the conversation/trajectory.'), tools: z.array(z.record(z.string(), z.any())).optional().describe('Available tools/functions that were provided to the agent.'), @@ -84,7 +91,8 @@ export const EvaluationRowSchema = z.object({ created_at: z.preprocess( (val) => typeof val === "string" ? new Date(val) : val, z.date() - ).describe('The timestamp when the row was created. Accepts string and parses to Date.') + ).describe('The timestamp when the row was created. Accepts string and parses to Date.'), + eval_metadata: EvalMetadataSchema.optional().describe('Metadata about the evaluation that was run.') }); // Agent Evaluation Framework (V2) schemas @@ -142,6 +150,7 @@ export type EvaluateResult = z.infer; export type CompletionParams = z.infer; export type InputMetadata = z.infer; export type CompletionUsage = z.infer; +export type EvalMetadata = z.infer; export type EvaluationRow = z.infer; export type ResourceServerConfig = z.infer; export type EvaluationCriteriaModel = z.infer; From 332f25baa7d12a9bcafac552ba6ffab802896a39 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:05:36 -0700 Subject: [PATCH 41/54] add more fields --- eval_protocol/models.py | 3 +++ eval_protocol/pytest/evaluation_test.py | 25 +++++++++++++++++++++++-- vite-app/src/types/eval-protocol.ts | 5 ++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/eval_protocol/models.py b/eval_protocol/models.py index 847dfc67..2870c0b5 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -209,6 +209,9 @@ class EvalMetadata(BaseModel): ..., description="Version of the evaluation. By default, we will populate this with the current commit hash." ) status: Literal["running", "finished", "error"] = Field("running", description="Status of the evaluation") + num_runs: int = Field(..., description="Number of times the evaluation was repeated") + aggregation_method: str = Field(..., description="Method used to aggregate scores across runs") + threshold_of_success: Optional[float] = Field(None, description="Threshold score for test success") class EvaluationRow(BaseModel): diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index f3db037f..904bc0fe 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -6,7 +6,7 @@ # Import versioneer for getting version information import versioneer from eval_protocol.dataset_logger import default_logger -from eval_protocol.models import EvalMetadata, EvaluationRow +from eval_protocol.models import CompletionParams, EvalMetadata, EvaluationRow, InputMetadata from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter from eval_protocol.pytest.default_no_op_rollout_process import default_no_op_rollout_processor from eval_protocol.pytest.types import ( @@ -207,9 +207,10 @@ def wrapper_body(**kwargs): raise ValueError("No input dataset or input messages provided") input_dataset: List[EvaluationRow] = [] + input_params = kwargs.get("input_params") or {} config = RolloutProcessorConfig( model=model_name, - input_params=kwargs.get("input_params") or {}, + input_params=input_params, mcp_config_path=mcp_config_path or "", max_concurrent_rollouts=max_concurrent_rollouts, server_script_path=server_script_path, @@ -217,6 +218,23 @@ def wrapper_body(**kwargs): ) input_dataset = execute_function(rollout_processor, rows=data, config=config) + # Populate completion_params in input_metadata for all rows + completion_params = CompletionParams( + model=model_name, + temperature=input_params.get("temperature"), + max_tokens=input_params.get("max_tokens"), + max_tool_calls=input_params.get("max_tool_calls"), + ) + + for row in input_dataset: + if row.input_metadata is None: + row.input_metadata = InputMetadata() + row.input_metadata.completion_params = completion_params + # Add mode to session_data + if row.input_metadata.session_data is None: + row.input_metadata.session_data = {} + row.input_metadata.session_data["mode"] = mode + all_results: List[EvaluationRow] = [] for _ in range(num_runs): if mode == "pointwise": @@ -263,6 +281,9 @@ def wrapper_body(**kwargs): description=test_func.__doc__, version=versioneer.get_version(), status="finished", + num_runs=num_runs, + aggregation_method=aggregation_method, + threshold_of_success=threshold_of_success, ) # Add metadata to all results before logging diff --git a/vite-app/src/types/eval-protocol.ts b/vite-app/src/types/eval-protocol.ts index c0ebedde..7e130f4c 100644 --- a/vite-app/src/types/eval-protocol.ts +++ b/vite-app/src/types/eval-protocol.ts @@ -78,7 +78,10 @@ export const EvalMetadataSchema = z.object({ name: z.string().describe('Name of the evaluation'), description: z.string().optional().describe('Description of the evaluation'), version: z.string().describe('Version of the evaluation. By default, we will populate this with the current commit hash.'), - status: z.enum(['running', 'finished', 'error']).default('running').describe('Status of the evaluation') + status: z.enum(['running', 'finished', 'error']).default('running').describe('Status of the evaluation'), + num_runs: z.number().int().describe('Number of times the evaluation was repeated'), + aggregation_method: z.string().describe('Method used to aggregate scores across runs'), + threshold_of_success: z.number().optional().describe('Threshold score for test success') }); export const EvaluationRowSchema = z.object({ From 75934d2e73fc859af01e4e1930abbc06f1c1a4e0 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:13:53 -0700 Subject: [PATCH 42/54] save --- vite-app/src/components/Dashboard.tsx | 21 ++++-- vite-app/src/components/Row.tsx | 95 +++++++++++++-------------- 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/vite-app/src/components/Dashboard.tsx b/vite-app/src/components/Dashboard.tsx index 98450e05..684eff98 100644 --- a/vite-app/src/components/Dashboard.tsx +++ b/vite-app/src/components/Dashboard.tsx @@ -71,6 +71,12 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => { {/* Expand/Collapse column */} + + Name + + + Status + Row ID @@ -81,16 +87,23 @@ const Dashboard = observer(({ onRefresh }: DashboardProps) => { Score - Messages + Created {/* Table Body */} - {state.dataset.map((row, index) => ( - - ))} + {state.dataset + .slice() + .sort( + (a, b) => + new Date(b.created_at).getTime() - + new Date(a.created_at).getTime() + ) + .map((row, index) => ( + + ))}
diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 130e8daf..9e7ddab6 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -5,7 +5,7 @@ import { ChatInterface } from "./ChatInterface"; import { MetadataSection } from "./MetadataSection"; export const Row = observer( - ({ row, index }: { row: EvaluationRow; index: number }) => { + ({ row }: { row: EvaluationRow; index: number }) => { const [isExpanded, setIsExpanded] = useState(false); const toggleExpanded = () => setIsExpanded(!isExpanded); @@ -50,6 +50,30 @@ export const Row = observer( )} + {/* Name */} + + + {row.eval_metadata?.name || "N/A"} + + + + {/* Status */} + + + {row.eval_metadata?.status || "N/A"} + + + {/* Row ID */} @@ -81,16 +105,24 @@ export const Row = observer( - {/* Messages */} + {/* Created */} - {row.messages.length} + + {row.created_at instanceof Date + ? row.created_at.toLocaleDateString() + + " " + + row.created_at.toLocaleTimeString() + : new Date(row.created_at).toLocaleDateString() + + " " + + new Date(row.created_at).toLocaleTimeString()} + {/* Expanded Content Row */} {isExpanded && ( - +
{/* Left Column - Chat Interface */} @@ -102,6 +134,12 @@ export const Row = observer( Metadata + {/* Eval Metadata */} + + {/* Evaluation Result */} {/* Usage Stats - Compact */} - {row.usage && ( -
-
- Token Usage -
-
-
-
- - Prompt: - {" "} - - {row.usage.prompt_tokens} - -
-
- - Completion: - {" "} - - {row.usage.completion_tokens} - -
-
- - Total: - {" "} - - {row.usage.total_tokens} - -
-
-
-
- )} + {/* Input Metadata - Less Important */} {/* Tools - Least Important */} - {row.tools && row.tools.length > 0 && ( -
-
- Available Tools -
-
-
-                            {JSON.stringify(row.tools, null, 1)}
-                          
-
-
- )} +
From 9be63e2ab0078d4716207034bab0f8b494f105c5 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:19:42 -0700 Subject: [PATCH 43/54] Refactor ChatInterface component to improve resize handle functionality and positioning, enhancing user experience for chat window adjustments. --- vite-app/src/components/ChatInterface.tsx | 25 +++++++++++++---------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/vite-app/src/components/ChatInterface.tsx b/vite-app/src/components/ChatInterface.tsx index 7725f96c..ad70ae18 100644 --- a/vite-app/src/components/ChatInterface.tsx +++ b/vite-app/src/components/ChatInterface.tsx @@ -112,7 +112,7 @@ export const ChatInterface = ({ messages }: ChatInterfaceProps) => { style={{ width: `${chatWidth}px` }} >
{messages.map((message, msgIndex) => ( @@ -120,25 +120,28 @@ export const ChatInterface = ({ messages }: ChatInterfaceProps) => { ))}
- {/* Horizontal resize handle */} + {/* Vertical resize handle - positioned outside the scrollable container */}
e.preventDefault()} /> - {/* Vertical resize handle */} + {/* Horizontal resize handle */}
e.preventDefault()} /> - {/* Corner resize handle */} + {/* Corner resize handle - positioned outside the scrollable container */}
e.preventDefault()} /> From 8e154ebf3ef50b3f1aefed225ec810d53876b666 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:22:15 -0700 Subject: [PATCH 44/54] Add 'passed' field to EvalMetadata and update evaluation logic to determine if the evaluation passed based on the threshold of success. --- eval_protocol/models.py | 1 + eval_protocol/pytest/evaluation_test.py | 14 +++++++++++--- vite-app/src/types/eval-protocol.ts | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/eval_protocol/models.py b/eval_protocol/models.py index 2870c0b5..74e030cc 100644 --- a/eval_protocol/models.py +++ b/eval_protocol/models.py @@ -212,6 +212,7 @@ class EvalMetadata(BaseModel): num_runs: int = Field(..., description="Number of times the evaluation was repeated") aggregation_method: str = Field(..., description="Method used to aggregate scores across runs") threshold_of_success: Optional[float] = Field(None, description="Threshold score for test success") + passed: Optional[bool] = Field(None, description="Whether the evaluation passed based on the threshold") class EvaluationRow(BaseModel): diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index 904bc0fe..a703277a 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -275,6 +275,14 @@ def wrapper_body(**kwargs): ) all_results.extend(results) + scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] + agg_score = aggregate(scores, aggregation_method) + + # Determine if the evaluation passed based on threshold + passed = None + if threshold_of_success is not None: + passed = agg_score >= threshold_of_success + # Create eval metadata with test function info and current commit hash eval_metadata = EvalMetadata( name=test_func.__name__, @@ -284,6 +292,7 @@ def wrapper_body(**kwargs): num_runs=num_runs, aggregation_method=aggregation_method, threshold_of_success=threshold_of_success, + passed=passed, ) # Add metadata to all results before logging @@ -291,9 +300,8 @@ def wrapper_body(**kwargs): r.eval_metadata = eval_metadata default_logger.log(r) - scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] - agg_score = aggregate(scores, aggregation_method) - if threshold_of_success is not None: + # Check threshold after logging + if threshold_of_success is not None and not passed: assert ( agg_score >= threshold_of_success ), f"Aggregated score {agg_score:.3f} below threshold {threshold_of_success}" diff --git a/vite-app/src/types/eval-protocol.ts b/vite-app/src/types/eval-protocol.ts index 7e130f4c..ee283e71 100644 --- a/vite-app/src/types/eval-protocol.ts +++ b/vite-app/src/types/eval-protocol.ts @@ -81,7 +81,8 @@ export const EvalMetadataSchema = z.object({ status: z.enum(['running', 'finished', 'error']).default('running').describe('Status of the evaluation'), num_runs: z.number().int().describe('Number of times the evaluation was repeated'), aggregation_method: z.string().describe('Method used to aggregate scores across runs'), - threshold_of_success: z.number().optional().describe('Threshold score for test success') + threshold_of_success: z.number().optional().describe('Threshold score for test success'), + passed: z.boolean().optional().describe('Whether the evaluation passed based on the threshold') }); export const EvaluationRowSchema = z.object({ From ce3eead66c9ba5d1a0124a5ce767e13c3de60080 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:23:09 -0700 Subject: [PATCH 45/54] Update Row component to change created date text color from gray-900 to gray-600 for improved visual consistency. --- vite-app/src/components/Row.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 9e7ddab6..17ae3b67 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -107,7 +107,7 @@ export const Row = observer( {/* Created */} - + {row.created_at instanceof Date ? row.created_at.toLocaleDateString() + " " + From 0409ef02a7877597ed706a27c18546d1ef023317 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:27:00 -0700 Subject: [PATCH 46/54] Refactor StatusIndicator component to accept status prop, enhancing flexibility for displaying connection and evaluation statuses. Update App and Row components to utilize the new StatusIndicator implementation. --- vite-app/src/App.tsx | 4 +- vite-app/src/components/Row.tsx | 15 +----- vite-app/src/components/StatusIndicator.tsx | 60 ++++++++++++++++----- 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/vite-app/src/App.tsx b/vite-app/src/App.tsx index 074b9ea1..f590a84d 100644 --- a/vite-app/src/App.tsx +++ b/vite-app/src/App.tsx @@ -123,7 +123,9 @@ const App = observer(() => { Eval Protocol
- + diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index 17ae3b67..e9c693cc 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -3,6 +3,7 @@ import { useState } from "react"; import type { EvaluationRow } from "../types/eval-protocol"; import { ChatInterface } from "./ChatInterface"; import { MetadataSection } from "./MetadataSection"; +import StatusIndicator from "./StatusIndicator"; export const Row = observer( ({ row }: { row: EvaluationRow; index: number }) => { @@ -59,19 +60,7 @@ export const Row = observer( {/* Status */} - - {row.eval_metadata?.status || "N/A"} - + {/* Row ID */} diff --git a/vite-app/src/components/StatusIndicator.tsx b/vite-app/src/components/StatusIndicator.tsx index a4ad971c..07a51d84 100644 --- a/vite-app/src/components/StatusIndicator.tsx +++ b/vite-app/src/components/StatusIndicator.tsx @@ -1,27 +1,63 @@ import React from "react"; interface StatusIndicatorProps { - isConnected: boolean; + status: string; className?: string; } const StatusIndicator: React.FC = ({ - isConnected, + status, className = "", }) => { + const getStatusConfig = (status: string) => { + switch (status.toLowerCase()) { + case "connected": + return { + dotColor: "bg-green-500", + textColor: "text-green-700", + text: "Connected", + }; + case "disconnected": + return { + dotColor: "bg-red-500", + textColor: "text-red-700", + text: "Disconnected", + }; + case "finished": + return { + dotColor: "bg-green-500", + textColor: "text-green-700", + text: "finished", + }; + case "running": + return { + dotColor: "bg-blue-500", + textColor: "text-blue-700", + text: "running", + }; + case "error": + return { + dotColor: "bg-red-500", + textColor: "text-red-700", + text: "error", + }; + default: + return { + dotColor: "bg-gray-500", + textColor: "text-gray-700", + text: status, + }; + } + }; + + const config = getStatusConfig(status); + return (
-
- {isConnected ? "Connected" : "Disconnected"} +
+ {config.text}
); }; From c4b9b3c25b4c6e0f5df47edf16fcb8774da25880 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:36:37 -0700 Subject: [PATCH 47/54] Refactor Agent class to accept EvaluationRow directly in the constructor, simplifying initialization. Update _call_model method to return a Message object with structured response data. Modify default_agent_rollout_processor to utilize the new constructor and streamline dataset population. Enhance evaluation_test to initialize eval_metadata for each row before running rollouts, ensuring consistent metadata handling. --- .../pytest/default_agent_rollout_processor.py | 20 +++---- eval_protocol/pytest/evaluation_test.py | 55 ++++++++++--------- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/eval_protocol/pytest/default_agent_rollout_processor.py b/eval_protocol/pytest/default_agent_rollout_processor.py index 676347c6..41996dad 100644 --- a/eval_protocol/pytest/default_agent_rollout_processor.py +++ b/eval_protocol/pytest/default_agent_rollout_processor.py @@ -20,9 +20,9 @@ class Agent: A really simple agent that calls the model until no more tool calls are needed. """ - def __init__(self, model: str, initial_messages: list[Message], config_path: str): + def __init__(self, model: str, row: EvaluationRow, config_path: str): self.model = model - self.evaluation_row: EvaluationRow = EvaluationRow(messages=initial_messages) + self.evaluation_row: EvaluationRow = row self._policy = LiteLLMPolicy(model_id=model) self.mcp_client = MCPMultiClient(config_path=config_path) if config_path else None self.tools: Union[List[ChatCompletionToolParam], NotGiven] = NOT_GIVEN @@ -82,13 +82,15 @@ async def call_agent(self) -> str: return await self.call_agent() return message["content"] - async def _call_model( - self, messages: list[Message], tools: Optional[list[ChatCompletionToolParam]] - ) -> ChatCompletionMessage: + async def _call_model(self, messages: list[Message], tools: Optional[list[ChatCompletionToolParam]]) -> Message: messages = [message.model_dump() if hasattr(message, "model_dump") else message for message in messages] tools = [{"function": tool["function"].model_dump(), "type": "function"} for tool in tools] if tools else [] response = await self._policy._make_llm_call(messages=messages, tools=tools) - return response["choices"][0]["message"] + return Message( + role=response["choices"][0]["message"]["role"], + content=response["choices"][0]["message"]["content"], + tool_calls=response["choices"][0]["message"]["tool_calls"], + ) async def _execute_tool_call( self, tool_call_id: str, tool_name: str, tool_args_dict: dict @@ -114,12 +116,10 @@ async def default_agent_rollout_processor( ) -> List[EvaluationRow]: dataset: Dataset = [] for row in rows: - agent = Agent(model=config.model, initial_messages=row.messages, config_path=config.mcp_config_path) + agent = Agent(model=config.model, row=row, config_path=config.mcp_config_path) await agent.setup() await agent.call_agent() - dataset.append( - EvaluationRow(ground_truth=row.ground_truth, **agent.evaluation_row.model_dump(exclude_none=True)) - ) + dataset.append(agent.evaluation_row) if agent.mcp_client: await agent.mcp_client.cleanup() return dataset diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index a703277a..cbf95587 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -206,19 +206,21 @@ def wrapper_body(**kwargs): else: raise ValueError("No input dataset or input messages provided") - input_dataset: List[EvaluationRow] = [] input_params = kwargs.get("input_params") or {} - config = RolloutProcessorConfig( - model=model_name, - input_params=input_params, - mcp_config_path=mcp_config_path or "", - max_concurrent_rollouts=max_concurrent_rollouts, - server_script_path=server_script_path, - steps=steps, + + # Create eval metadata with test function info and current commit hash + eval_metadata = EvalMetadata( + name=test_func.__name__, + description=test_func.__doc__, + version=versioneer.get_version(), + status="running", + num_runs=num_runs, + aggregation_method=aggregation_method, + threshold_of_success=threshold_of_success, + passed=None, ) - input_dataset = execute_function(rollout_processor, rows=data, config=config) - # Populate completion_params in input_metadata for all rows + # Populate completion_params in input_metadata for all rows and initialize eval_metadata BEFORE rollouts completion_params = CompletionParams( model=model_name, temperature=input_params.get("temperature"), @@ -226,7 +228,7 @@ def wrapper_body(**kwargs): max_tool_calls=input_params.get("max_tool_calls"), ) - for row in input_dataset: + for row in data: if row.input_metadata is None: row.input_metadata = InputMetadata() row.input_metadata.completion_params = completion_params @@ -234,6 +236,19 @@ def wrapper_body(**kwargs): if row.input_metadata.session_data is None: row.input_metadata.session_data = {} row.input_metadata.session_data["mode"] = mode + # Initialize eval_metadata for each row + row.eval_metadata = eval_metadata + + # Now run the rollout processor with metadata-initialized data + config = RolloutProcessorConfig( + model=model_name, + input_params=input_params, + mcp_config_path=mcp_config_path or "", + max_concurrent_rollouts=max_concurrent_rollouts, + server_script_path=server_script_path, + steps=steps, + ) + input_dataset = execute_function(rollout_processor, rows=data, config=config) all_results: List[EvaluationRow] = [] for _ in range(num_runs): @@ -283,21 +298,11 @@ def wrapper_body(**kwargs): if threshold_of_success is not None: passed = agg_score >= threshold_of_success - # Create eval metadata with test function info and current commit hash - eval_metadata = EvalMetadata( - name=test_func.__name__, - description=test_func.__doc__, - version=versioneer.get_version(), - status="finished", - num_runs=num_runs, - aggregation_method=aggregation_method, - threshold_of_success=threshold_of_success, - passed=passed, - ) - - # Add metadata to all results before logging + # Update eval metadata status and passed field for all results for r in all_results: - r.eval_metadata = eval_metadata + if r.eval_metadata is not None: + r.eval_metadata.status = "finished" + r.eval_metadata.passed = passed default_logger.log(r) # Check threshold after logging From ffe942ed3a35fd5d760921056cce1dbb13a0cfb0 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:38:20 -0700 Subject: [PATCH 48/54] fix rollout --- .../pytest/default_agent_rollout_processor.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/eval_protocol/pytest/default_agent_rollout_processor.py b/eval_protocol/pytest/default_agent_rollout_processor.py index 41996dad..4c3b576e 100644 --- a/eval_protocol/pytest/default_agent_rollout_processor.py +++ b/eval_protocol/pytest/default_agent_rollout_processor.py @@ -52,13 +52,13 @@ async def call_agent(self) -> str: message = await self._call_model(self.messages, tools) self.append_message_and_log(message) - if message["tool_calls"]: + if message.tool_calls: # Create tasks for all tool calls to run them in parallel tool_tasks = [] - for tool_call in message["tool_calls"]: - tool_call_id = tool_call["id"] - tool_name = tool_call["function"]["name"] - tool_args = tool_call["function"]["arguments"] + for tool_call in message.tool_calls: + tool_call_id = tool_call.id + tool_name = tool_call.function.name + tool_args = tool_call.function.arguments tool_args_dict = json.loads(tool_args) # Create a task for each tool call @@ -69,7 +69,7 @@ async def call_agent(self) -> str: tool_results: List[tuple[str, List[TextContent]]] = await asyncio.gather(*tool_tasks) # Add all tool results to messages (they will be in the same order as tool_calls) - for tool_call, (tool_call_id, content) in zip(message["tool_calls"], tool_results): + for tool_call, (tool_call_id, content) in zip(message.tool_calls, tool_results): self.append_message_and_log( Message( role="tool", @@ -80,7 +80,7 @@ async def call_agent(self) -> str: ) ) return await self.call_agent() - return message["content"] + return message.content async def _call_model(self, messages: list[Message], tools: Optional[list[ChatCompletionToolParam]]) -> Message: messages = [message.model_dump() if hasattr(message, "model_dump") else message for message in messages] From a0cb830268fd226c1d6353a1a7b6785320120191 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:45:14 -0700 Subject: [PATCH 49/54] Refactor evaluation_test to improve error handling and metadata initialization. Ensure eval_metadata is set for each row before rollouts, and enhance exception management to log errors appropriately while maintaining pytest behavior. --- eval_protocol/pytest/evaluation_test.py | 242 +++++++++++++----------- 1 file changed, 133 insertions(+), 109 deletions(-) diff --git a/eval_protocol/pytest/evaluation_test.py b/eval_protocol/pytest/evaluation_test.py index cbf95587..17fb9d4d 100644 --- a/eval_protocol/pytest/evaluation_test.py +++ b/eval_protocol/pytest/evaluation_test.py @@ -194,122 +194,146 @@ def create_wrapper_with_signature() -> Callable: # Create the function body that will be used def wrapper_body(**kwargs): model_name = kwargs["model"] - - # Handle dataset loading - if "dataset_path" in kwargs and kwargs["dataset_path"] is not None: - data = load_jsonl(kwargs["dataset_path"]) - if max_dataset_rows is not None: - data = data[:max_dataset_rows] - data = dataset_adapter(data) - elif "input_messages" in kwargs and kwargs["input_messages"] is not None: - data: List[EvaluationRow] = [EvaluationRow(messages=kwargs["input_messages"])] - else: - raise ValueError("No input dataset or input messages provided") - - input_params = kwargs.get("input_params") or {} - - # Create eval metadata with test function info and current commit hash - eval_metadata = EvalMetadata( - name=test_func.__name__, - description=test_func.__doc__, - version=versioneer.get_version(), - status="running", - num_runs=num_runs, - aggregation_method=aggregation_method, - threshold_of_success=threshold_of_success, - passed=None, - ) - - # Populate completion_params in input_metadata for all rows and initialize eval_metadata BEFORE rollouts - completion_params = CompletionParams( - model=model_name, - temperature=input_params.get("temperature"), - max_tokens=input_params.get("max_tokens"), - max_tool_calls=input_params.get("max_tool_calls"), - ) - - for row in data: - if row.input_metadata is None: - row.input_metadata = InputMetadata() - row.input_metadata.completion_params = completion_params - # Add mode to session_data - if row.input_metadata.session_data is None: - row.input_metadata.session_data = {} - row.input_metadata.session_data["mode"] = mode - # Initialize eval_metadata for each row - row.eval_metadata = eval_metadata - - # Now run the rollout processor with metadata-initialized data - config = RolloutProcessorConfig( - model=model_name, - input_params=input_params, - mcp_config_path=mcp_config_path or "", - max_concurrent_rollouts=max_concurrent_rollouts, - server_script_path=server_script_path, - steps=steps, - ) - input_dataset = execute_function(rollout_processor, rows=data, config=config) - + eval_metadata = None all_results: List[EvaluationRow] = [] - for _ in range(num_runs): - if mode == "pointwise": - # Pointwise mode: apply the evaluator function to each row - for row in input_dataset: - result = execute_with_params( + + try: + # Handle dataset loading + data: List[EvaluationRow] = [] + if "dataset_path" in kwargs and kwargs["dataset_path"] is not None: + data_jsonl = load_jsonl(kwargs["dataset_path"]) + if max_dataset_rows is not None: + data_jsonl = data_jsonl[:max_dataset_rows] + data = dataset_adapter(data_jsonl) + elif "input_messages" in kwargs and kwargs["input_messages"] is not None: + data: List[EvaluationRow] = [EvaluationRow(messages=kwargs["input_messages"])] + else: + raise ValueError("No input dataset or input messages provided") + + input_params = kwargs.get("input_params") or {} + + # Create eval metadata with test function info and current commit hash + eval_metadata = EvalMetadata( + name=test_func.__name__, + description=test_func.__doc__, + version=versioneer.get_version(), + status="running", + num_runs=num_runs, + aggregation_method=aggregation_method, + threshold_of_success=threshold_of_success, + passed=None, + ) + + # Populate completion_params in input_metadata for all rows and initialize eval_metadata BEFORE rollouts + completion_params = CompletionParams( + model=model_name, + temperature=input_params.get("temperature"), + max_tokens=input_params.get("max_tokens"), + max_tool_calls=input_params.get("max_tool_calls"), + ) + + for row in data: + if row.input_metadata is None: + row.input_metadata = InputMetadata() + row.input_metadata.completion_params = completion_params + # Add mode to session_data + if row.input_metadata.session_data is None: + row.input_metadata.session_data = {} + row.input_metadata.session_data["mode"] = mode + # Initialize eval_metadata for each row + row.eval_metadata = eval_metadata + + # Now run the rollout processor with metadata-initialized data + config = RolloutProcessorConfig( + model=model_name, + input_params=input_params, + mcp_config_path=mcp_config_path or "", + max_concurrent_rollouts=max_concurrent_rollouts, + server_script_path=server_script_path, + steps=steps, + ) + input_dataset = execute_function(rollout_processor, rows=data, config=config) + + for _ in range(num_runs): + if mode == "pointwise": + # Pointwise mode: apply the evaluator function to each row + for row in input_dataset: + result = execute_with_params( + test_func, + row=row, + evaluation_test_kwargs=kwargs.get("evaluation_test_kwargs") or {}, + ) + if result is None or not isinstance(result, EvaluationRow): + raise ValueError( + f"Test function {test_func.__name__} did not return an EvaluationRow instance. You must return an EvaluationRow instance from your test function decorated with @evaluation_test." + ) + all_results.append(result) + else: + # Batch mode: call the test function with the full dataset + results = execute_with_params( test_func, - row=row, + input_dataset=input_dataset, evaluation_test_kwargs=kwargs.get("evaluation_test_kwargs") or {}, ) - if result is None or not isinstance(result, EvaluationRow): + if results is None: raise ValueError( f"Test function {test_func.__name__} did not return an EvaluationRow instance. You must return an EvaluationRow instance from your test function decorated with @evaluation_test." ) - all_results.append(result) - else: - # Batch mode: call the test function with the full dataset - results = execute_with_params( - test_func, - input_dataset=input_dataset, - evaluation_test_kwargs=kwargs.get("evaluation_test_kwargs") or {}, - ) - if results is None: - raise ValueError( - f"Test function {test_func.__name__} did not return an EvaluationRow instance. You must return an EvaluationRow instance from your test function decorated with @evaluation_test." - ) - if not isinstance(results, list): - raise ValueError( - f"Test function {test_func.__name__} did not return a list of EvaluationRow instances. You must return a list of EvaluationRow instances from your test function decorated with @evaluation_test." - ) - if not results: - raise ValueError( - f"Test function {test_func.__name__} returned an empty list. You must return a non-empty list of EvaluationRow instances from your test function decorated with @evaluation_test." - ) - if not all(isinstance(r, EvaluationRow) for r in results): - raise ValueError( - f"Test function {test_func.__name__} returned a list containing non-EvaluationRow instances. You must return a list of EvaluationRow instances from your test function decorated with @evaluation_test." - ) - all_results.extend(results) - - scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] - agg_score = aggregate(scores, aggregation_method) - - # Determine if the evaluation passed based on threshold - passed = None - if threshold_of_success is not None: - passed = agg_score >= threshold_of_success - - # Update eval metadata status and passed field for all results - for r in all_results: - if r.eval_metadata is not None: - r.eval_metadata.status = "finished" - r.eval_metadata.passed = passed - default_logger.log(r) - - # Check threshold after logging - if threshold_of_success is not None and not passed: - assert ( - agg_score >= threshold_of_success - ), f"Aggregated score {agg_score:.3f} below threshold {threshold_of_success}" + if not isinstance(results, list): + raise ValueError( + f"Test function {test_func.__name__} did not return a list of EvaluationRow instances. You must return a list of EvaluationRow instances from your test function decorated with @evaluation_test." + ) + if not results: + raise ValueError( + f"Test function {test_func.__name__} returned an empty list. You must return a non-empty list of EvaluationRow instances from your test function decorated with @evaluation_test." + ) + if not all(isinstance(r, EvaluationRow) for r in results): + raise ValueError( + f"Test function {test_func.__name__} returned a list containing non-EvaluationRow instances. You must return a list of EvaluationRow instances from your test function decorated with @evaluation_test." + ) + all_results.extend(results) + + scores = [r.evaluation_result.score for r in all_results if r.evaluation_result] + agg_score = aggregate(scores, aggregation_method) + + # Determine if the evaluation passed based on threshold + passed = None + if threshold_of_success is not None: + passed = agg_score >= threshold_of_success + + # Update eval metadata status and passed field for all results + for r in all_results: + if r.eval_metadata is not None: + r.eval_metadata.status = "finished" + r.eval_metadata.passed = passed + default_logger.log(r) + + # Check threshold after logging + if threshold_of_success is not None and not passed: + assert ( + agg_score >= threshold_of_success + ), f"Aggregated score {agg_score:.3f} below threshold {threshold_of_success}" + + except Exception as e: + # Update eval metadata status to error and log it + if eval_metadata is not None: + eval_metadata.status = "error" + eval_metadata.passed = False + + # Create a minimal result row to log the error if we don't have any results yet + if not data: + error_row = EvaluationRow(messages=[], eval_metadata=eval_metadata, evaluation_result=None) + default_logger.log(error_row) + else: + # Update existing results with error status + for r in data: + if r.eval_metadata is not None: + r.eval_metadata.status = "error" + r.eval_metadata.passed = False + default_logger.log(r) + + # Re-raise the exception to maintain pytest behavior + raise return create_dynamically_parameterized_wrapper(test_func, wrapper_body, test_param_names) From afcc280222d82ce0a6a97157d48a0dc75baf74dd Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:46:33 -0700 Subject: [PATCH 50/54] Add .eval_protocol to .gitignore and remove outdated JSONL dataset file. This update ensures that unnecessary files are ignored during version control, streamlining project management. --- .eval_protocol/datasets/2025-08-05.jsonl | 11 ----------- .gitignore | 1 + 2 files changed, 1 insertion(+), 11 deletions(-) delete mode 100644 .eval_protocol/datasets/2025-08-05.jsonl diff --git a/.eval_protocol/datasets/2025-08-05.jsonl b/.eval_protocol/datasets/2025-08-05.jsonl deleted file mode 100644 index 3dbdc3c3..00000000 --- a/.eval_protocol/datasets/2025-08-05.jsonl +++ /dev/null @@ -1,11 +0,0 @@ -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and processes.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"inference endpoints deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for more specific deployment management topics:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment configuration scaling Fireworks\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment status monitoring Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"custom model deployment Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Does Fireworks support custom base models?\nLink: https://docs.fireworks.ai/faq-new/models-inference/does-fireworks-support-custom-base-models\nContent: Yes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\nDoes Fireworks support custom base models?\nYes, custom base models can be deployed via firectl . You can learn more about custom model deployment in our guide on uploading custom models.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":null,"tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"firectl deployment tool Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management commands and tools:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment commands CLI Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try searching for deployment configuration and management:","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment configuration YAML JSON Fireworks\"}"}}]},{"role":"tool","content":"Title: Create a fine-tuning job\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-finetune-job\nContent: Creates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\nCreates a fine-tuning job on Fireworks AI platform with the provided configuration yaml.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my search results, here's what I can teach you about managing deployments on Fireworks AI:\n\n## Deployment Management on Fireworks AI\n\n### 1. **Deployment Performance Expectations**\n- **Initial deployment**: Should complete within minutes\n- **Scaling from zero**: May experience brief availability delays while the system scales up\n- **Troubleshooting**: If deployment takes over 1 hour, this typically indicates a crash and should be investigated\n- **Best practice**: Monitor deployment status and contact support if deployment times are unusually long\n\n### 2. **Custom Model Deployment**\nFireworks AI supports custom base models through `firectl` - their deployment tool. You can deploy custom models using this command-line interface.\n\n### 3. **Deployment Tools**\n- **firectl**: The primary deployment tool for managing models on Fireworks AI\n- Used for both standard and custom model deployments\n- Supports configuration via YAML files\n\n### 4. **Monitoring and Management**\n- Monitor deployment status regularly\n- Contact support for unusually long deployment times\n- Watch for scaling delays when starting from zero instances\n\n### 5. **Configuration Management**\nDeployments can be configured using YAML configuration files, similar to how fine-tuning jobs are configured.\n\n## Next Steps for Managing Deployments\n\nTo get started with deployment management, you should:\n\n1. **Install firectl**: The Fireworks AI command-line tool\n2. **Prepare your model**: Ensure your model is properly formatted and ready for deployment\n3. **Create deployment configuration**: Use YAML files to define deployment parameters\n4. **Monitor deployment**: Use built-in monitoring tools to track deployment status\n5. **Scale as needed**: Configure auto-scaling based on your traffic patterns\n\nWould you like me to search for more specific information about any of these deployment management aspects, such as specific firectl commands or configuration examples?","tool_calls":[]}],"input_metadata":{"row_id":"feel-might-gaseous-picture"},"created_at":"2025-08-05T10:43:36.343980"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more specific deployment-related terms and features.","tool_calls":[{"id":"functions.search:1","type":"function","function":{"name":"search","arguments":"{\"query\": \"model deployment Fireworks AI platform features\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for specific deployment management concepts like scaling, monitoring, and configuration.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment scaling monitoring configuration\"}"}}]},{"role":"tool","content":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more comprehensive deployment management information including deployment methods and best practices.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment methods best practices model serving\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for specific deployment commands and API endpoints.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI API deployment endpoints commands CLI\"}"}}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for deployment configuration and management features.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI deployment configuration model settings\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment management topics like autoscaling, load balancing, and deployment lifecycle.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"Fireworks AI autoscaling load balancing deployment lifecycle management\"}"}}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the information I've gathered, let me provide you with a comprehensive guide on managing deployments on Fireworks AI:\n\n## Managing Deployments on Fireworks AI\n\n### 1. Deployment Performance Expectations\n\n**Initial Deployment:**\n- Should complete within minutes\n- Monitor deployment status actively\n\n**Scaling from Zero:**\n- May experience brief availability delays while the system scales up\n- This is normal behavior when scaling from zero instances\n\n**Troubleshooting:**\n- If deployment takes over 1 hour, this typically indicates a crash\n- Contact support if deployment times are unusually long\n\n### 2. Key Deployment Management Commands\n\nHere are the essential commands you'll need:\n\n```bash\n# Check deployment status\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/status\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Monitor scaling events\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/scaling\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Update deployment configuration\ncurl -X PATCH \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"min_instances\": 2,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7\n }'\n```\n\n### 3. Deployment Configuration Management\n\n**Basic Configuration:**\n```python\nimport fireworks.client\n\n# Configure deployment settings\ndeployment_config = {\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"deployment_name\": \"my-production-model\",\n \"min_instances\": 1,\n \"max_instances\": 5,\n \"scaling_threshold\": 0.8,\n \"timeout\": 30\n}\n\n# Create deployment\nresponse = fireworks.client.deployments.create(\n model=deployment_config[\"model\"],\n deployment_name=deployment_config[\"deployment_name\"],\n min_instances=deployment_config[\"min_instances\"],\n max_instances=deployment_config[\"max_instances\"]\n)\n```\n\n### 4. Monitoring and Observability\n\n**Set up monitoring:**\n```python\nimport requests\nimport time\n\ndef monitor_deployment_health(deployment_id):\n \"\"\"Monitor deployment health and scaling events\"\"\"\n url = f\"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/metrics\"\n headers = {\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n \n response = requests.get(url, headers=headers)\n metrics = response.json()\n \n return {\n \"cpu_utilization\": metrics.get(\"cpu_utilization\"),\n \"memory_usage\": metrics.get(\"memory_usage\"),\n \"active_instances\": metrics.get(\"active_instances\"),\n \"request_count\": metrics.get(\"request_count\"),\n \"error_rate\": metrics.get(\"error_rate\")\n }\n\n# Continuous monitoring loop\nwhile True:\n health = monitor_deployment_health(\"your-deployment-id\")\n print(f\"Active instances: {health['active_instances']}\")\n print(f\"CPU utilization: {health['cpu_utilization']}%\")\n time.sleep(60) # Check every minute\n```\n\n### 5. Autoscaling Configuration\n\n**Configure autoscaling parameters:**\n```json\n{\n \"autoscaling\": {\n \"min_instances\": 1,\n \"max_instances\": 10,\n \"target_cpu_utilization\": 0.7,\n \"scale_up_cooldown\": 60,\n \"scale_down_cooldown\": 300,\n \"metrics\": {\n \"cpu\": {\n \"target\": 70,\n \"type\": \"Utilization\"\n },\n \"memory\": {\n \"target\": 80,\n \"type\": \"Utilization\"\n }\n }\n }\n}\n```\n\n### 6. Deployment Lifecycle Management\n\n**Rolling updates:**\n```bash\n# Perform rolling update without downtime\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/update\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"strategy\": \"rolling\",\n \"max_unavailable\": 1,\n \"max_surge\": 1,\n \"new_config\": {\n \"image\": \"new-model-version:latest\",\n \"resources\": {\n \"cpu\": \"2\",\n \"memory\": \"4Gi\"\n }\n }\n }'\n```\n\n### 7. Best Practices for Deployment Management\n\n1. **Health Checks:**\n```python\ndef deployment_health_check(endpoint):\n \"\"\"Perform health check on deployment\"\"\"\n try:\n response = requests.get(\n f\"{endpoint}/health\",\n timeout=5,\n headers={\"Authorization\": f\"Bearer {FIREWORKS_API_KEY}\"}\n )\n return response.status_code == 200\n except:\n return False\n```\n\n2. **Resource Management:**\n```yaml\n# Recommended resource allocation\nresources:\n requests:\n cpu: 1000m\n memory: 2Gi\n limits:\n cpu: 2000m\n memory: 4Gi\n```\n\n3. **Monitoring Setup:**\n```python\n# Set up alerts for critical metrics\nalerts = {\n \"high_error_rate\": lambda x: x > 0.05,\n \"high_latency\": lambda x: x > 1000,\n \"low_availability\": lambda x: x < 0.99\n}\n```\n\n### 8. Deployment Rollback\n\n**Rollback to previous version:**\n```bash\n# Rollback deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/rollback\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"revision\": \"previous\",\n \"reason\": \"performance degradation\"\n }'\n```\n\n### 9. Cost Optimization\n\n**Set up cost monitoring:**\n```python\ndef calculate_deployment_cost(instance_type, hours_running):\n \"\"\"Calculate deployment costs\"\"\"\n pricing = {\n \"small\": 0.05, # per hour\n \"medium\": 0.10, # per hour\n \"large\": 0.20 # per hour\n }\n return pricing.get(instance_type, 0.10) * hours_running\n```\n\n### 10. Troubleshooting Common Issues\n\n**Deployment stuck:**\n```bash\n# Check deployment logs\ncurl -X GET \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/logs\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n\n# Restart deployment\ncurl -X POST \"https://api.fireworks.ai/inference/v1/deployments/{deployment_id}/restart\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\nThis comprehensive guide covers the key aspects of managing deployments on Fireworks AI. Start with basic monitoring and gradually implement more advanced features like autoscaling and rolling updates as your needs grow.","tool_calls":[]}],"input_metadata":{"row_id":"identify-be-unfriendly-girl"},"created_at":"2025-08-05T10:59:52.732744"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployments management create update delete scale\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"create deployment configuration scaling replicas\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Replica count (horizontal scaling)\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: The number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\nThe number of replicas (horizontal scaling) is specified by passing the --min-replica-count and --max-replica-count flags. Increasing the number of replicas will increase the maximum QPS the deployment can support. The deployment will automatically scale based on server load. Auto-scaling up may fail if there is a GPU stockout. Use reserved capacity to guarantee capacity for your deployments. The default value for --min-replica-count is 0. Setting --min-replica-count to 0 enables the deployment to auto-scale to 0 if a deployment is unused (i.e. no inference requests) for a specified \"scale-to-zero\" time window. While the deployment is scaled to 0, you will not pay for any GPU utilization. The default value for --max-replica-count is 1 if --min-replica-count=0 , or the value of\n--min-replica-count otherwise. firectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment management CLI commands create update list\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment configuration parameters GPU memory CPU firectl\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Which accelerator/GPU should I use?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/which-acceleratorgpu-should-i-use\nContent: It depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\nWhich accelerator/GPU should I use?\nIt depends on your specific needs. Fireworks has two grouping of accelerators: smaller (A100) and larger (H100, H200, and MI300X) accelerators. Small accelerators are less expensive (see pricing page ), so they’re more cost-effective for low-volume use cases. However, if you have enough volume to fully utilize a larger accelerator, we find that they tend to be both faster and more cost-effective per token. Choosing between larger accelerators depends on the use case. MI300X has the highest memory capacity and sometimes enables large models to be deployed with comparatively few GPUs. For example, unquantized Llama 3.1 70B fits on one MI300X and FP8 Llama 405B fits on 4 MI300X’s. Higher memory also may enable better throughput for longer prompts and less sharded deployments. It’s also more affordably priced than the H100. H100 offers blazing fast inference and often provides the highest throughput, especially for high-volume use cases H200 is recommended for large models like DeepSeek V3 and DeepSeek R1 e.g. the minimum config for DeepSeek V3, DeepSeek R1 is 8 H200s.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"list deployments get deployment status update deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl list deployments get deployment configuration examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"get deployment status check deployment health API endpoint\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: This endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment lifecycle states status monitoring health checks\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Check Batch Status\nLink: https://docs.fireworks.ai/api-reference/get-batch-status\nContent: Check Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nCheck Batch Status\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\nThis endpoint allows you to check the current status of a previously submitted batch request, and retrieve the final result if available. Try notebook Check status of your batch request\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"firectl deployment commands examples create list update delete\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management tutorial examples firectl commands\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, let me provide you with a comprehensive guide on managing deployments on Fireworks. I'll cover the key aspects including creation, configuration, scaling, monitoring, and deletion.\n\n## Managing Deployments on Fireworks: Complete Guide\n\n### 1. Prerequisites and Setup\n\nBefore managing deployments, ensure your account ID is properly configured to avoid \"invalid id\" errors:\n\n```bash\n# Configure your account ID\nexport FIREWORKS_ACCOUNT_ID=\"your-account-id\"\n```\n\n### 2. Creating Deployments\n\n#### Basic Deployment Creation\n```bash\n# Create a basic deployment\nfirectl create deployment \n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 5 \\\n --accelerator-type A100 \\\n --accelerator-count 1\n```\n\n#### Advanced Deployment Configuration\n```bash\n# Create deployment with comprehensive settings\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 3 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --display-name \"My Production Model\" \\\n --description \"High-performance deployment for production workloads\"\n```\n\n### 3. Deployment Scaling Configuration\n\n#### Horizontal Scaling (Replica Management)\n```bash\n# Auto-scaling configuration\nfirectl create deployment \\\n --min-replica-count 0 \\ # Scale to zero when unused\n --max-replica-count 10 \\ # Maximum replicas\n --autoscaling-policy.scale-up-window \"60s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"600s\"\n```\n\n#### Fixed Scaling\n```bash\n# Fixed number of replicas\nfirectl create deployment \\\n --min-replica-count 3 \\\n --max-replica-count 3 # Fixed at 3 replicas\n```\n\n### 4. GPU and Resource Configuration\n\n#### GPU Selection Guide\n- **A100**: Cost-effective for low-volume use cases\n- **H100**: Highest throughput for high-volume use cases\n- **H200**: Recommended for large models (DeepSeek V3/R1)\n- **MI300X**: Highest memory capacity, best for large models\n\n```bash\n# Different GPU configurations\nfirectl create deployment \\\n --accelerator-type A100 \\\n --accelerator-count 1\n\nfirectl create deployment \\\n --accelerator-type H100 \\\n --accelerator-count 8 # For large models like Llama 405B\n```\n\n### 5. Listing and Monitoring Deployments\n\n#### List All Deployments\n```bash\n# List all deployments in your account\nfirectl list deployments\n\n# Get specific deployment details\nfirectl get deployment \n```\n\n#### API-based Monitoring\n```bash\n# Check deployment status via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 6. Updating Deployments\n\n#### Update Configuration\n```bash\n# Update deployment via API\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 5,\n \"maxReplicaCount\": 10,\n \"displayName\": \"Updated Production Model\",\n \"description\": \"Increased capacity for higher load\"\n }'\n```\n\n#### Common Update Scenarios\n```bash\n# Scale up for increased demand\nfirectl update deployment \\\n --min-replica-count 5 \\\n --max-replica-count 15\n\n# Update display name and description\nfirectl update deployment \\\n --display-name \"Production Llama 3.1 70B\" \\\n --description \"Main production deployment for customer service\"\n```\n\n### 7. Deployment Lifecycle Management\n\n#### Deployment States\n- **STATE_UNSPECIFIED**: Initial state\n- **CREATING**: Deployment is being created\n- **RUNNING**: Deployment is active and serving requests\n- **UPDATING**: Configuration is being updated\n- **DELETING**: Deployment is being deleted\n- **ERROR**: Deployment encountered an error\n\n#### Health Monitoring\n```bash\n# Check deployment health\nfirectl get deployment --watch\n\n# Monitor via API\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" | jq '.status'\n```\n\n### 8. Deleting Deployments\n\n#### Soft Deletion (Default)\n```bash\n# Delete deployment (soft delete)\nfirectl delete deployment \n\n# API-based deletion\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n#### Hard Deletion\n```bash\n# Force deletion ignoring checks\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment-id}?hard=true&ignoreChecks=true\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\"\n```\n\n### 9. Best Practices\n\n#### Cost Optimization\n```bash\n# Enable scale-to-zero for development environments\nfirectl create deployment \\\n --min-replica-count 0 \\\n --max-replica-count 2 \\\n --accelerator-type A100\n\n# Use reserved capacity for production\nfirectl create deployment \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --reserved-capacity true\n```\n\n#### Monitoring Setup\n```bash\n# Set up alerts for deployment health\n# Monitor key metrics:\n# - Replica count\n# - Request latency\n# - Error rates\n# - GPU utilization\n```\n\n### 10. Troubleshooting Common Issues\n\n#### Invalid ID Errors\n```bash\n# Fix account ID configuration\nexport FIREWORKS_ACCOUNT_ID=$(firectl get account | jq -r '.id')\necho \"Account ID: $FIREWORKS_ACCOUNT_ID\"\n```\n\n#### Scaling Issues\n```bash\n# Check for GPU stockouts\nfirectl get deployment --verbose\n\n# Verify resource availability\nfirectl list available-resources --region us-central1\n```\n\n### Complete Example: Production Deployment\n\n```bash\n#!/bin/bash\n# Production deployment script\n\nMODEL_NAME=\"llama-3.1-70b-instruct\"\nDEPLOYMENT_NAME=\"prod-llama-70b-$(date +%Y%m%d)\"\n\n# Create production deployment\nfirectl create deployment $MODEL_NAME \\\n --display-name $DEPLOYMENT_NAME \\\n --description \"Production Llama 3.1 70B for customer service\" \\\n --min-replica-count 2 \\\n --max-replica-count 10 \\\n --accelerator-type H100 \\\n --accelerator-count 2 \\\n --precision fp16 \\\n --region us-central1 \\\n --autoscaling-policy.scale-up-window \"30s\" \\\n --autoscaling-policy.scale-down-window \"300s\" \\\n --autoscaling-policy.scale-to-zero-window \"1800s\"\n\n# Get deployment ID\nDEPLOYMENT_ID=$(firectl list deployments | grep $DEPLOYMENT_NAME | awk '{print $1}')\n\n# Monitor deployment status\necho \"Monitoring deployment: $DEPLOYMENT_ID\"\nfirectl get deployment $DEPLOYMENT_ID --watch\n```\n\nThis comprehensive guide covers all aspects of managing deployments on Fireworks, from basic creation to advanced scaling and monitoring strategies.","tool_calls":[]}],"input_metadata":{"row_id":"ask-calculate-final-president"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:02:19.141203"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"deployment management Fireworks AI\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management features and workflows.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deploy models Fireworks AI deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me try searching for more specific deployment-related terms.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"model deployment Fireworks AI console\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI deployment dashboard management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment-related documentation.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI model serving deployment configuration\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me try a different approach and search for API documentation or deployment guides.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI API deployment endpoints management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Responses API\nLink: https://docs.fireworks.ai/guides/response-api\nContent: Fireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\nFireworks.ai offers a powerful Responses API that allows for more complex and stateful interactions with models. This guide will walk you through the key features and how to use them. Data Retention Policy The Responses API has a different data retention policy than the chat completions endpoint. See Data Privacy & security.\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI function calling deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific deployment and scaling information.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks AI scaling deployment production models\"}","name":"search"},"type":"function"}]},{"role":"tool","content":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on the available information, let me provide you with a comprehensive guide on managing deployments on Fireworks AI. While the search results are limited, I can share the key aspects of deployment management based on the platform's capabilities.\n\n## Managing Deployments on Fireworks AI\n\n### 1. **Deployment Overview**\nFireworks AI provides a streamlined approach to deploying AI models with minimal configuration. The platform handles infrastructure management automatically, allowing you to focus on model performance and application logic.\n\n### 2. **Key Deployment Management Features**\n\n#### **Model Deployment Options**\n```python\n# Basic model deployment using Fireworks client\nimport fireworks.client\n\n# Set your API key\nfireworks.client.api_key = \"your-api-key\"\n\n# Deploy a model for inference\nresponse = fireworks.client.ChatCompletion.create(\n model=\"accounts/fireworks/models/llama-v2-70b-chat\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### **Deployment Configuration**\n```python\n# Advanced deployment with custom configurations\ndeployment_config = {\n \"model\": \"your-model-name\",\n \"max_tokens\": 4096,\n \"temperature\": 0.7,\n \"top_p\": 0.9,\n \"deployment_type\": \"dedicated\" # or \"shared\"\n}\n```\n\n### 3. **Deployment Management Commands**\n\n#### **Deploy a New Model**\n```bash\n# Using Fireworks CLI (if available)\nfireworks deploy create \\\n --model \"accounts/your-account/models/your-model\" \\\n --name \"production-deployment\" \\\n --config production-config.yaml\n```\n\n#### **Scale Deployments**\n```bash\n# Scale up deployment instances\nfireworks deployment scale \\\n --deployment-id \"dep_123456\" \\\n --replicas 5 \\\n --min-instances 2 \\\n --max-instances 10\n```\n\n#### **Update Deployment Configuration**\n```bash\n# Update existing deployment\nfireworks deployment update \\\n --deployment-id \"dep_123456\" \\\n --config updated-config.yaml \\\n --rolling-update true\n```\n\n### 4. **Monitoring and Management**\n\n#### **Check Deployment Status**\n```python\nimport requests\n\n# Check deployment health\nresponse = requests.get(\n \"https://api.fireworks.ai/v1/deployments/dep_123456/status\",\n headers={\"Authorization\": f\"Bearer {api_key}\"}\n)\nstatus = response.json()\nprint(f\"Deployment Status: {status['state']}\")\n```\n\n#### **Monitor Performance Metrics**\n```python\n# Get deployment metrics\nmetrics = fireworks.client.Deployment.metrics(\n deployment_id=\"dep_123456\",\n time_range=\"24h\",\n metrics=[\"latency\", \"throughput\", \"error_rate\"]\n)\n```\n\n### 5. **Deployment Lifecycle Management**\n\n#### **Blue-Green Deployments**\n```yaml\n# deployment-config.yaml\ndeployment_strategy:\n type: \"blue_green\"\n traffic_split:\n blue: 90\n green: 10\n health_check:\n enabled: true\n path: \"/health\"\n interval: 30s\n```\n\n#### **A/B Testing Deployments**\n```python\n# Configure A/B testing between model versions\nab_config = {\n \"deployment_a\": {\n \"model\": \"model-v1\",\n \"traffic_percentage\": 50\n },\n \"deployment_b\": {\n \"model\": \"model-v2\", \n \"traffic_percentage\": 50\n },\n \"evaluation_metrics\": [\"latency\", \"accuracy\", \"user_satisfaction\"]\n}\n```\n\n### 6. **Production Deployment Best Practices**\n\n#### **Environment Management**\n```bash\n# Set up different environments\nfireworks env create production\nfireworks env create staging\nfireworks env create development\n\n# Deploy to specific environment\nfireworks deploy --env production --model your-model\n```\n\n#### **Configuration Management**\n```yaml\n# production-config.yaml\ndeployment:\n environment: production\n region: us-east-1\n auto_scaling:\n enabled: true\n min_instances: 2\n max_instances: 20\n target_cpu_utilization: 70\n monitoring:\n enabled: true\n metrics_collection: detailed\n alerting:\n - metric: latency_p99\n threshold: 1000ms\n action: scale_up\n```\n\n### 7. **Rollback and Recovery**\n\n#### **Rollback Deployment**\n```bash\n# Rollback to previous version\nfireworks deployment rollback \\\n --deployment-id \"dep_123456\" \\\n --version \"v1.2.3\" \\\n --strategy immediate\n```\n\n#### **Disaster Recovery**\n```python\n# Automated failover configuration\nfailover_config = {\n \"primary_region\": \"us-east-1\",\n \"backup_regions\": [\"us-west-2\", \"eu-west-1\"],\n \"failover_trigger\": {\n \"error_rate_threshold\": 5,\n \"latency_threshold\": 2000,\n \"health_check_failures\": 3\n }\n}\n```\n\n### 8. **Cost Optimization**\n\n#### **Auto-scaling Policies**\n```yaml\nscaling_policies:\n - type: \"target_tracking\"\n target_value: 70\n scale_up_cooldown: 300\n scale_down_cooldown: 300\n - type: \"scheduled\"\n schedule: \"0 2 * * *\" # Scale down at 2 AM\n min_instances: 1\n max_instances: 3\n```\n\n### 9. **Security and Access Control**\n\n#### **Deployment Access Management**\n```bash\n# Set deployment permissions\nfireworks deployment permissions set \\\n --deployment-id \"dep_123456\" \\\n --team \"engineering\" \\\n --role \"read-only\"\n\n# API key management\nfireworks api-keys create \\\n --deployment-id \"dep_123456\" \\\n --permissions \"read,write\" \\\n --expiry \"30d\"\n```\n\n### 10. **Integration with CI/CD**\n\n#### **GitHub Actions Integration**\n```yaml\n# .github/workflows/deploy.yml\nname: Deploy to Fireworks\non:\n push:\n branches: [main]\njobs:\n deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - name: Deploy to Fireworks\n run: |\n fireworks deploy create \\\n --model ${{ github.sha }} \\\n --config production-config.yaml\n```\n\n### Next Steps\n\n1. **Start with a staging deployment** to test your configuration\n2. **Set up monitoring** before going to production\n3. **Implement proper alerting** for critical metrics\n4. **Use infrastructure as code** for consistent deployments\n5. **Regular testing** of rollback procedures\n\nWould you like me to dive deeper into any specific aspect of deployment management, such as scaling strategies, monitoring setup, or cost optimization techniques?","tool_calls":[]}],"input_metadata":{"row_id":"miss-strong-gentle-side"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T11:04:58.857123"} -{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll retrieve their channels and recent messages.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"contain-current-brave-community"},"created_at":"2025-08-05T12:37:12.408698"} -{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","type":"function","function":{"name":"list_servers","arguments":"{}"}}]}],"input_metadata":{"row_id":"win-slow-office-student"},"created_at":"2025-08-05T12:40:45.354325"} -{"messages":[{"role":"user","content":"Can you give me a summary of every channel. You can list servers and channels using the list_servers and get_channels tools. And you can read messages using the read_messages tool."},{"role":"assistant","content":"I'll help you get a summary of every channel across all servers. Let me start by getting the list of servers, then I'll get the channels for each server, and finally read recent messages from each channel.","tool_calls":[{"id":"functions.list_servers:0","function":{"arguments":"{}","name":"list_servers"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Available Servers (3):\\nFireworks AI Community (ID: 1234567890123456789, Members: 15420)\\nAI Development Hub (ID: 9876543210987654321, Members: 8234)\\nMachine Learning Enthusiasts (ID: 5556667778889990001, Members: 5678)\"}","type":"text"}],"tool_call_id":"functions.list_servers:0"},{"role":"assistant","content":"Now let me get the channels for each server:","tool_calls":[{"id":"functions.get_channels:1","function":{"arguments":"{\"server_id\": \"1234567890123456789\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:2","function":{"arguments":"{\"server_id\": \"9876543210987654321\"}","name":"get_channels"},"type":"function"},{"id":"functions.get_channels:3","function":{"arguments":"{\"server_id\": \"5556667778889990001\"}","name":"get_channels"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"server_name\": \"Fireworks AI Community\", \"server_id\": \"1234567890123456789\", \"channels\": {\"1111111111111111111\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion about AI and machine learning\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"2222222222222222222\": {\"name\": \"announcements\", \"type\": \"text\", \"position\": 1, \"archived\": false, \"category_id\": null, \"topic\": \"Important announcements and updates\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"3333333333333333333\": {\"name\": \"help-support\", \"type\": \"text\", \"position\": 2, \"archived\": false, \"category_id\": null, \"topic\": \"Get help with AI-related questions\", \"nsfw\": false, \"slowmode_delay\": 5, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"4444444444444444444\": {\"name\": \"voice-chat\", \"type\": \"voice\", \"position\": 3, \"archived\": false, \"category_id\": null, \"topic\": null, \"nsfw\": null, \"slowmode_delay\": null, \"user_limit\": 10, \"bitrate\": 64000, \"created_at\": \"2023-01-15T10:30:00+00:00\"}, \"5555555555555555555\": {\"name\": \"fireworks-team\", \"type\": \"text\", \"position\": 4, \"archived\": false, \"category_id\": null, \"topic\": \"Internal team discussions\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-15T10:30:00+00:00\"}}, \"total_channels\": 5}","type":"text"}],"tool_call_id":"functions.get_channels:1"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"9876543210987654321\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:2"},{"role":"tool","content":[{"text":"{\"server_name\": \"Mock Server\", \"server_id\": \"5556667778889990001\", \"channels\": {\"9999999999999999999\": {\"name\": \"general\", \"type\": \"text\", \"position\": 0, \"archived\": false, \"category_id\": null, \"topic\": \"General discussion\", \"nsfw\": false, \"slowmode_delay\": 0, \"user_limit\": null, \"bitrate\": null, \"created_at\": \"2023-01-01T00:00:00+00:00\"}}, \"total_channels\": 1}","type":"text"}],"tool_call_id":"functions.get_channels:3"},{"role":"assistant","content":"Now let me read recent messages from each text channel. I'll use a recent timestamp to get the latest messages:","tool_calls":[{"id":"functions.read_messages:4","function":{"arguments":"{\"channel_id\": \"1111111111111111111\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:5","function":{"arguments":"{\"channel_id\": \"2222222222222222222\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:6","function":{"arguments":"{\"channel_id\": \"3333333333333333333\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:7","function":{"arguments":"{\"channel_id\": \"5555555555555555555\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"},{"id":"functions.read_messages:8","function":{"arguments":"{\"channel_id\": \"9999999999999999999\", \"after\": \"2024-12-19T00:00:00+00:00\"}","name":"read_messages"},"type":"function"}]},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 3 messages after December 19, 2024 at 12:00 AM UTC in general:\\n\\n Message 1 (id: 1000000000000000001):\\n Author: Alice#1234\\n Timestamp: August 05, 2025 at 05:42 PM UTC\\n Content: Has anyone tried the new Fireworks model? It's amazing!\\n Reactions: \\ud83d\\udc4d(5), \\ud83d\\udd25(3)\\n Message 2 (id: 1000000000000000002):\\n Author: Bob#5678\\n Timestamp: August 05, 2025 at 06:12 PM UTC\\n Content: Yes! The performance is incredible. What are you using it for?\\n Reactions: \\ud83d\\udc4d(2)\\n Reply to: message(id=1000000000000000001) by Alice#1234 at August 05, 2025 at 05:42 PM UTC\\n Message 3 (id: 1000000000000000003):\\n Author: Fireworks Team#9999 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 06:42 PM UTC\\n Content: We're glad you're enjoying it! Let us know if you have any questions.\\n Reactions: \\u2764\\ufe0f(8)\"}","type":"text"}],"tool_call_id":"functions.read_messages:4"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:5"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 2 messages after December 19, 2024 at 12:00 AM UTC in help-support:\\n\\n Message 1 (id: 2000000000000000001):\\n Author: Charlie#1111\\n Timestamp: August 05, 2025 at 04:42 PM UTC\\n Content: I'm having trouble with the API rate limits. Can someone help?\\n Message 2 (id: 2000000000000000002):\\n Author: Fireworks Support#8888 (Fireworks Employee)\\n Timestamp: August 05, 2025 at 04:57 PM UTC\\n Content: Hi Charlie! Can you share your current usage and the specific error you're seeing?\\n Reactions: \\u2705(1)\\n Reply to: message(id=2000000000000000001) by Charlie#1111 at August 05, 2025 at 04:42 PM UTC\"}","type":"text"}],"tool_call_id":"functions.read_messages:6"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:7"},{"role":"tool","content":[{"text":"{\"result\": \"Retrieved 1 messages after December 19, 2024 at 12:00 AM UTC in mock-channel:\\n\\n Message 1 (id: 9999999999999999999):\\n Author: MockUser#0000\\n Timestamp: August 05, 2025 at 07:42 PM UTC\\n Content: This is a mock message for testing purposes.\"}","type":"text"}],"tool_call_id":"functions.read_messages:8"},{"role":"assistant","content":"## Summary of Every Channel\n\nHere's a comprehensive summary of all channels across the three Discord servers:\n\n### **Fireworks AI Community** (15,420 members)\n**5 Channels:**\n\n1. **#general** - General discussion about AI and machine learning\n - Recent activity: Discussion about the new Fireworks model with positive feedback\n - 3 recent messages including team engagement\n\n2. **#announcements** - Important announcements and updates\n - No recent messages found\n\n3. **#help-support** - Get help with AI-related questions\n - Active support request about API rate limits\n - Fireworks support team actively responding to user issues\n\n4. **#voice-chat** - Voice channel (10 user limit, 64kbps)\n - No message activity (voice channel)\n\n5. **#fireworks-team** - Internal team discussions\n - No recent messages found\n\n### **AI Development Hub** (8,234 members)\n**1 Channel:**\n\n1. **#general** - General discussion\n - Only mock/test message activity detected\n\n### **Machine Learning Enthusiasts** (5,678 members)\n**1 Channel:**\n\n1. **#general** - General discussion \n - Only mock/test message activity detected\n\n### **Key Observations:**\n- **Most Active Server**: Fireworks AI Community has the most channels and active discussions\n- **Most Active Channel**: #general in Fireworks AI Community has genuine user engagement about AI models\n- **Support Activity**: #help-support shows active user support with official team responses\n- **Limited Activity**: The other two servers appear to have minimal genuine activity beyond test messages\n\nThe Fireworks AI Community server appears to be the primary hub with real user engagement, particularly around AI model discussions and technical support.","tool_calls":[]}],"input_metadata":{"row_id":"buy-major-change-thing"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T12:42:09.241914"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]}],"input_metadata":{"row_id":"achieve-poor-art-teacher"},"created_at":"2025-08-05T12:58:20.118600"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","type":"function","function":{"name":"search","arguments":"{\"query\": \"deployment management Fireworks AI\"}"}}]}],"input_metadata":{"row_id":"report-serve-significant-head"},"created_at":"2025-08-05T13:04:02.839130"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks AI. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"manage deployments Fireworks AI deployment management\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","type":"text"},{"text":"Title: How do I close my Fireworks.ai account?\nLink: https://docs.fireworks.ai/faq-new/account-access/how-do-i-close-my-fireworksai-account\nContent: To close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nHow do I close my Fireworks.ai account?\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\n","type":"text"},{"text":"Title: I have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nLink: https://docs.fireworks.ai/faq-new/account-access/i-have-multiple-fireworks-accounts-when-i-try-to-login-with-google-on-fireworks\nContent: If you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nI have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\n","type":"text"},{"text":"Title: Introduction\nLink: https://docs.fireworks.ai/api-reference/introduction\nContent: Fireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nIntroduction\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\n","type":"text"},{"text":"Title: Do you host your deployments in the EU or Asia?\nLink: https://docs.fireworks.ai/faq-new/support-general/do-you-host-your-deployments-in-the-eu-or-asia\nContent: We are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nDo you host your deployments in the EU or Asia?\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\n","type":"text"},{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: On-demand deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: If you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\n","type":"text"},{"text":"Title: How much does Fireworks cost?\nLink: https://docs.fireworks.ai/faq-new/billing-pricing/how-much-does-fireworks-cost\nContent: Fireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nHow much does Fireworks cost?\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\n","type":"text"},{"text":"Title: Migration and traffic management\nLink: https://docs.fireworks.ai/guides/prompt-caching\nContent: When migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\nWhen migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\nWhen migrating between deployments that use prompt caching, it's crucial to implement proper traffic routing to maintain optimal cache hit rates. When gradually routing traffic to a new deployment, use consistent user/session-based sampling rather than random sampling. Here's the recommended implementation for traffic routing: import hashlib\n\n# Configure traffic fraction (e.g., 20% to new deployment)\nfireworks_traffic_fraction = 0.2\nuser_id = \"session-id-123\"\n\n# Generate deterministic hash from user_id\nhashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16) # MD5 hash on user-id and convert to integer\nMAX_HASH = 2**128 - 1 # MD5 hash maximum value\n\n# Compute ratio for consistent routing\nratio = hashed_user_id / MAX_HASH # Returns 0.0 to 1.0\n\nif (ratio < fireworks_traffic_fraction):\n send_to_new_deployment(user=hashed_user_id) # Pass user ID for caching\nelse:\n send_elsewhere() # Route to old deployment or serverless\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Create a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management, including creating, updating, and managing deployments.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deployment management API create update delete list deployments\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Delete API Key\nLink: https://docs.fireworks.ai/api-reference/delete-api-key\nContent: \n\n\n\nREST Endpoint POST /v1/accounts/{account_id}/apiKeys:delete\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"keyId\":\"\"}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: Managing default deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: Since a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\nSince a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\nSince a model may be deployed to multiple deployments, querying by model name will route to the \"default\" deployed model. You can see which deployed model entry is marked with Default: true using: This will show the Deployed Model Refs section with the Default: true entry. To update the default deployed model, note the Name of the deployed model reference above. Then run: To delete a default deployment you must delete all other deployments for the same model first, or designate a different deployed model as the default as described above. This is to ensure that querying by model name will always route to an unambiguous default deployment as long as deployments for the model exist.\n\n","type":"text"},{"text":"Title: List Deployments\nLink: https://docs.fireworks.ai/api-reference/list-deployments\nContent: REST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\nREST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\n\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Creates a new deployment.\n\nCreates a new deployment.\n\nCreates a new deployment.\n\n","type":"text"},{"text":"Title: Deleting Stored Responses\nLink: https://docs.fireworks.ai/guides/response-api\nContent: When responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\nWhen responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\nWhen responses are stored (the default behavior with store=True ), you can immediately delete them from storage using the DELETE endpoint. This permanently removes the conversation data. from fireworks import LLM\nimport requests\nimport os\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\n# Create a response\nresponse = llm.responses.create(\n input=\"What is the capital of France?\",\n store=True # This is the default\n)\n\nresponse_id = response.id\nprint(f\"Created response with ID: {response_id}\")\n\n# Delete the response immediately\nheaders = {\n \"Authorization\": f\"Bearer {os.getenv('FIREWORKS_API_KEY')}\",\n \"x-fireworks-account-id\": \"your-account-id\"\n}\ndelete_response = requests.delete(\n f\"https://api.fireworks.ai/inference/v1/responses/{response_id}\",\n headers=headers\n)\n\nif delete_response.status_code == 200:\n print(\"Response deleted successfully\")\nelse:\n print(f\"Failed to delete response: {delete_response.status_code}\")\n\n","type":"text"},{"text":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","type":"text"},{"text":"Title: Delete a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/delete-resources\nContent: Deletes an model deployment.\n\nDeletes an model deployment.\n\nDeletes an model deployment.\n\n","type":"text"},{"text":"Title: delete_deployment(ignore_checks: bool = False, wait: bool = True)\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-reference\nContent: Deletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\nDeletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\nDeletes the deployment associated with this LLM instance if one exists. Arguments: ignore_checks bool, optional - Whether to ignore safety checks. Defaults to False. wait bool, optional - Whether to wait for deletion to complete. Defaults to True. llm.delete_deployment(ignore_checks=True)\n\n","type":"text"}],"tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more information about the Fireworks Build SDK and practical deployment management examples.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"Fireworks Build SDK deployment management Python examples\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: Basics of the Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-basics\nContent: Why use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nWhy use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nWhy use the Build SDK?\nThe Fireworks Build SDK gives you a declarative way to work with Fireworks resources like deployments, fine-tuning jobs, and datasets. We've designed it to handle all the infrastructure complexity for you, letting you focus on building your application. Instead of using the web UI, CLI, or raw API calls, you can manage everything through simple Python code with smart, logical defaults without sacrificing control and customizability. The principles of the SDK are the following: Object-oriented: Fireworks primitives are represented as Python objects. You can access their capabilities and properties through methods and attributes. Declarative: You can describe your desired state and the SDK will handle reconcilliation. Smart defaults: The SDK will infer the most logical defaults for you, prioritizing development speed and lowest cost. Here are some examples: The SDK will automatically use a serverless deployment for models that are available serverlessly unless you specify otherwise. When creating deployments, the SDK will also enable scale-to-zero with the shortest possible scale-down window. If the SDK determines that a resource already exists by matching its signature (see below), it will re-use the existing resource instead of creating a new one. Customizable: Although we enable smart defaults, you still have full access to the configuration parameters for any Fireworks resource The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: 🔧 Build SDK: Deployment Configuration Application Requirement\nLink: https://docs.fireworks.ai/updates/changelog\nContent: The Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\nThe Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\nThe Build SDK now requires you to call .apply() to apply any deployment configurations to Fireworks when using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" . This change ensures explicit control over when deployments are created and helps prevent accidental deployment creation. Key changes: .apply() is now required for on-demand and on-demand-lora deployments Serverless deployments do not require .apply() calls If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments Migration guide: Add llm.apply() after creating LLM instances with deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" No changes needed for serverless deployments See updated documentation for examples and best practices This change improves deployment management and provides better control over resource creation. This applies to Python SDK version >=0.19.14.\n\n","type":"text"},{"text":"Title: Example with Fireworks Build SDK\nLink: https://docs.fireworks.ai/faq-new/models-inference/how-to-get-performance-metrics-for-streaming-responses\nContent: from fireworks import LLM\nimport os\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\",\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n)\n\n# Streaming completion with performance metrics\nstream = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}],\n max_tokens=100,\n stream=True,\n perf_metrics_in_response=True,\n)\n\nfor chunk in stream:\n # Use getattr to avoid linter errors for unknown attributes\n perf_metrics = getattr(chunk, \"perf_metrics\", None)\n finish_reason = getattr(chunk.choices[0], \"finish_reason\", None)\n if perf_metrics is not None and finish_reason:\n print(\"Performance metrics:\", perf_metrics)\n\nfrom fireworks import LLM\nimport os\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\",\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n)\n\n# Streaming completion with performance metrics\nstream = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}],\n max_tokens=100,\n stream=True,\n perf_metrics_in_response=True,\n)\n\nfor chunk in stream:\n # Use getattr to avoid linter errors for unknown attributes\n perf_metrics = getattr(chunk, \"perf_metrics\", None)\n finish_reason = getattr(chunk.choices[0], \"finish_reason\", None)\n if perf_metrics is not None and finish_reason:\n print(\"Performance metrics:\", perf_metrics)\n\nExample with cURL\ncurl -X POST \"https://api.fireworks.ai/inference/v1/completions\" \\\n -H \"Authorization: Bearer $FIREWORKS_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"prompt\": \"The quick brown fox\",\n \"max_tokens\": 100,\n \"stream\": true,\n \"perf_metrics_in_response\": true\n }'\n\n","type":"text"},{"text":"Title: Set up your developer environment & call the Fireworks API\nLink: https://docs.fireworks.ai/getting-started/quickstart\nContent: This is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\nThis is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\nThis is the recommended way to get started : This Python (Fireworks) tab uses our Fireworks Build\nSDK for the best performance and developer experience.\nSee our Client-side performance\noptimization guide for\nmore details. Install SDK Before installing, ensure that you have the right version of Python installed. Optionally you might want to setup a virtual environment too. The Fireworks Build SDK provides a declarative way to work with Fireworks resources and is OpenAI API Compatible. Configure API Key Step-by-step instructions for setting an environment variable for respective OS platforms: Depending on your shell, you'll need to edit either ~/.bash_profile for Bash or ~/.zshrc for Zsh .\nYou can do this by running the command: Add a new line to the file with the following: After saving the file, you'll need to apply the changes by either restarting your terminal session or running depending on the file you edited. You can verify that the variable has been set correctly by running echo $FIREWORKS_API_KEY You can open Command Prompt by searching for it in the Windows search bar or by pressing Win + R, typing cmd, and pressing Enter. To verify that the variable has been set correctly, you can close and reopen Command Prompt and type: Sending the first API Request You can quickly instantiate the LLM class and call the Fireworks API. The Build SDK handles deployment management automatically. from fireworks import LLM\n\n# Basic usage - SDK automatically selects optimal deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}]\n)\n\nprint(response.choices[0].message.content)\n\n","type":"text"},{"text":"Title: Step 1: Configure the Fireworks Build SDK\nLink: https://docs.fireworks.ai/structured-responses/structured-output-grammar-based\nContent: from fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\nfrom fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\nfrom fireworks import LLM\n\nclient = LLM(\n model=\"llama-v3p1-405b-instruct\",\n deployment_type=\"serverless\"\n)\n\n","type":"text"},{"text":"Title: Deployment with the Build SDK\nLink: https://docs.fireworks.ai/fine-tuning/single-lora\nContent: You can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\nYou can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\nYou can also deploy your LoRA fine-tuned model using the Build SDK: from fireworks import LLM\n\n# Deploy a fine-tuned model with on-demand deployment (live merge)\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand\",\n id=\"my-fine-tuned-deployment\" # Simple string identifier\n)\n\n# Apply the deployment to ensure it's ready\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n\n# Track deployment in web dashboard\nprint(f\"Track at: {fine_tuned_llm.deployment_url}\")\n\n","type":"text"},{"text":"Title: Foreword\nLink: https://docs.fireworks.ai/tools-sdks/python-client/the-tutorial\nContent: This tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\nThis tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\nThis tutorial demonstrates how to use the Fireworks AI Python SDK with a few toy examples. First, we will use the LLM class to make a simple request to various models and compare the outputs. Then, we will try to fine-tune a model to learn information it has never seen before. This tutorial will cost $10 to run due to the on-demand model deployments.\n\n","type":"text"},{"text":"Title: Code example: Optimal concurrent requests (Python)\nLink: https://docs.fireworks.ai/deployments/client-side-performance-optimization\nContent: Here's how to implement optimal concurrent requests using asyncio and the LLM class: import asyncio\nfrom fireworks import LLM\n\nasync def make_concurrent_requests(\n messages: list[str],\n max_workers: int = 1000,\n max_connections: int = 1000, # this is the default value in the SDK\n):\n \"\"\"Make concurrent requests with optimized connection pooling\"\"\"\n \n llm = LLM(\n model=\"your-model-name\",\n deployment_type=\"on-demand\", \n id=\"your-deployment-id\",\n max_connections=max_connections\n )\n \n # Apply deployment configuration to Fireworks\n llm.apply()\n \n # Semaphore to limit concurrent requests\n semaphore = asyncio.Semaphore(max_workers)\n \n async def single_request(message: str):\n \"\"\"Make a single request with semaphore control\"\"\"\n async with semaphore:\n response = await llm.chat.completions.acreate(\n messages=[{\"role\": \"user\", \"content\": message}],\n max_tokens=100\n )\n return response.choices[0].message.content\n \n # Create all request tasks\n tasks = [\n single_request(message) \n for message in messages\n ]\n \n # Execute all requests concurrently\n results = await asyncio.gather(*tasks)\n return results\n\n# Usage example\nasync def main():\n messages = [\"Hello!\"] * 1000 # 1000 requests\n \n results = await make_concurrent_requests(\n messages=messages,\n )\n \n print(f\"Completed {len(results)} requests\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n\nHere's how to implement optimal concurrent requests using asyncio and the LLM class: import asyncio\nfrom fireworks import LLM\n\nasync def make_concurrent_requests(\n messages: list[str],\n max_workers: int = 1000,\n max_connections: int = 1000, # this is the default value in the SDK\n):\n \"\"\"Make concurrent requests with optimized connection pooling\"\"\"\n \n llm = LLM(\n model=\"your-model-name\",\n deployment_type=\"on-demand\", \n id=\"your-deployment-id\",\n max_connections=max_connections\n )\n \n # Apply deployment configuration to Fireworks\n llm.apply()\n \n # Semaphore to limit concurrent requests\n semaphore = asyncio.Semaphore(max_workers)\n \n async def single_request(message: str):\n \"\"\"Make a single request with semaphore control\"\"\"\n async with semaphore:\n response = await llm.chat.completions.acreate(\n messages=[{\"role\": \"user\", \"content\": message}],\n max_tokens=100\n )\n return response.choices[0].message.content\n \n # Create all request tasks\n tasks = [\n single_request(message) \n for message in messages\n ]\n \n # Execute all requests concurrently\n results = await asyncio.gather(*tasks)\n return results\n\n# Usage example\nasync def main():\n messages = [\"Hello!\"] * 1000 # 1000 requests\n \n results = await make_concurrent_requests(\n messages=messages,\n )\n \n print(f\"Completed {len(results)} requests\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n\nClient-side performance optimization\nWhen using a dedicated deployment, it is important to optimize the client-side\nHTTP connection pooling for maximum performance. We recommend using our Python\nSDK as it has good defaults for\nconnection pooling and utilizes\naiohttp for optimal performance\nwith Python's asyncio library. It also includes retry logic for handling 429 errors that Fireworks returns when the server is overloaded. We have run\nbenchmarks that demonstrate the performance benefits.\n\n","type":"text"},{"text":"Title: Storing Responses\nLink: https://docs.fireworks.ai/guides/response-api\nContent: By default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\nBy default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\nBy default, responses are stored and can be referenced by their ID. You can disable this by setting store=False . If you do this, you will not be able to use the previous_response_id to continue the conversation. For a complete example, see the store=False notebook. from fireworks import LLM\n\nllm = LLM(model=\"qwen3-235b-a22b\", deployment_type=\"serverless\")\n\nresponse = llm.responses.create(\n input=\"give me 5 interesting facts on modelcontextprotocol/python-sdk -- keep it short!\",\n store=False,\n tools=[{\"type\": \"mcp\", \"server_url\": \"https://mcp.deepwiki.com/mcp\"}]\n)\n\n# This will fail because the previous response was not stored\ntry:\n continuation_response = llm.responses.create(\n input=\"Explain the second fact in more detail.\",\n previous_response_id=response.id\n )\nexcept Exception as e:\n print(e)\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Based on my research, I'll provide you with a comprehensive guide on managing deployments on Fireworks AI. Let me break this down into practical sections with code examples.\n\n## Overview of Deployment Management on Fireworks AI\n\nFireworks AI offers several ways to manage deployments:\n\n1. **Fireworks Build SDK (Python)** - Recommended approach\n2. **REST API** - Direct HTTP API calls\n3. **Web Dashboard** - GUI-based management\n4. **CLI Tools** - Command-line interface\n\n## 1. Using the Fireworks Build SDK (Recommended)\n\nThe Fireworks Build SDK provides the most intuitive way to manage deployments programmatically.\n\n### Installation\n```bash\npip install fireworks-ai\n```\n\n### Basic Deployment Management\n\n#### Creating Deployments\n```python\nfrom fireworks import LLM\nimport os\n\n# Set your API key\nos.environ[\"FIREWORKS_API_KEY\"] = \"your-api-key\"\n\n# Create an on-demand deployment\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"my-llama-deployment\",\n min_replica_count=1,\n max_replica_count=4,\n accelerator_type=\"A100-80GB-SXM\",\n accelerator_count=1\n)\n\n# Apply the deployment (required for on-demand deployments)\nllm.apply()\n\nprint(f\"Deployment created! Track at: {llm.deployment_url}\")\n```\n\n#### Serverless Deployments (Automatic)\n```python\n# Serverless deployments don't require explicit management\nllm_serverless = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"serverless\"\n)\n\n# Use immediately - no deployment management needed\nresponse = llm_serverless.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### Managing Fine-tuned Model Deployments\n```python\n# Deploy a fine-tuned LoRA model\nfine_tuned_llm = LLM(\n model=\"accounts/your-account/models/your-fine-tuned-model-id\",\n deployment_type=\"on-demand-lora\",\n id=\"my-fine-tuned-deployment\"\n)\n\n# Apply the deployment\nfine_tuned_llm.apply()\n\n# Use the deployed model\nresponse = fine_tuned_llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n#### Deleting Deployments\n```python\n# Delete deployment associated with LLM instance\nllm.delete_deployment(ignore_checks=True, wait=True)\n\n# Or delete by deployment ID\nfrom fireworks.resources.deployments import Deployment\n\ndeployment = Deployment.get(\"deployment-id-to-delete\")\ndeployment.delete(ignore_checks=True)\n```\n\n### Advanced Deployment Configuration\n\n```python\nfrom fireworks import LLM\n\n# Advanced deployment with custom configuration\nllm = LLM(\n model=\"llama-v3p1-70b-instruct\",\n deployment_type=\"on-demand\",\n id=\"production-llama-70b\",\n \n # Scaling configuration\n min_replica_count=2,\n max_replica_count=10,\n autoscaling_policy={\n \"scale_up_window\": \"60s\",\n \"scale_down_window\": \"300s\",\n \"scale_to_zero_window\": \"600s\"\n },\n \n # Hardware configuration\n accelerator_type=\"H100-80GB-SXM\",\n accelerator_count=2,\n precision=\"float16\",\n \n # Placement configuration\n placement={\n \"regions\": [\"us-east-1\", \"us-west-2\"],\n \"multi_region\": \"MULTI_REGION_UNSPECIFIED\"\n },\n \n # Additional features\n enable_addons=True,\n draft_model=\"llama-v3p1-8b-instruct\",\n draft_token_count=8\n)\n\n# Apply configuration\nllm.apply()\n```\n\n## 2. Using the REST API\n\n### List All Deployments\n```python\nimport requests\nimport os\n\naccount_id = \"your-account-id\"\napi_key = os.environ[\"FIREWORKS_API_KEY\"]\n\nheaders = {\n \"Authorization\": f\"Bearer {api_key}\",\n \"x-fireworks-account-id\": account_id\n}\n\n# List deployments\nresponse = requests.get(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\",\n headers=headers\n)\n\ndeployments = response.json()\nfor deployment in deployments.get(\"deployments\", []):\n print(f\"Deployment: {deployment['displayName']} - Status: {deployment['state']}\")\n```\n\n### Create Deployment via API\n```python\nimport requests\nimport json\n\ndeployment_config = {\n \"displayName\": \"my-new-deployment\",\n \"description\": \"Production deployment for customer service\",\n \"baseModel\": \"accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"acceleratorType\": \"A100-80GB-SXM\",\n \"acceleratorCount\": 1,\n \"minReplicaCount\": 1,\n \"maxReplicaCount\": 5,\n \"autoscalingPolicy\": {\n \"scaleUpWindow\": \"60s\",\n \"scaleDownWindow\": \"300s\",\n \"scaleToZeroWindow\": \"600s\"\n }\n}\n\nresponse = requests.post(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\",\n headers=headers,\n json=deployment_config\n)\n\nprint(f\"Deployment created: {response.json()}\")\n```\n\n### Update Deployment\n```python\nupdate_config = {\n \"maxReplicaCount\": 10,\n \"description\": \"Updated production deployment with higher capacity\"\n}\n\nresponse = requests.patch(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\",\n headers=headers,\n json=update_config\n)\n```\n\n### Delete Deployment\n```python\nresponse = requests.delete(\n f\"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\",\n headers=headers,\n params={\"hard\": True, \"ignoreChecks\": True}\n)\n```\n\n## 3. Managing Default Deployments\n\nWhen you have multiple deployments of the same model, Fireworks uses a \"default\" deployment for routing:\n\n```python\n# Check which deployment is default\nfrom fireworks.resources.deployments import Deployment\n\ndeployments = Deployment.list(\n filter='baseModel=\"accounts/fireworks/models/llama-v3p1-8b-instruct\"'\n)\n\nfor deployment in deployments:\n print(f\"Deployment: {deployment.display_name}, Default: {deployment.is_default}\")\n\n# Update default deployment\ndeployment = Deployment.get(\"deployment-id-to-make-default\")\ndeployment.make_default()\n```\n\n## 4. Cost Management and Best Practices\n\n### Monitoring Deployment Costs\n```python\n# Check deployment status and costs\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"cost-optimized-deployment\"\n)\n\n# Enable scale-to-zero to minimize costs\nllm.update_deployment(\n min_replica_count=0,\n autoscaling_policy={\n \"scale_to_zero_window\": \"300s\"\n }\n)\n```\n\n### Automated Cleanup Script\n```python\nimport asyncio\nfrom datetime import datetime, timedelta\nfrom fireworks.resources.deployments import Deployment\n\nasync def cleanup_unused_deployments():\n \"\"\"Clean up deployments that haven't been used for 24 hours\"\"\"\n \n deployments = Deployment.list()\n \n for deployment in deployments:\n # Check last usage\n last_used = deployment.last_used_time\n if last_used and datetime.now() - last_used > timedelta(hours=24):\n print(f\"Deleting unused deployment: {deployment.display_name}\")\n deployment.delete()\n\n# Run cleanup\nasyncio.run(cleanup_unused_deployments())\n```\n\n## 5. Traffic Management and Migration\n\nWhen migrating between deployments, use consistent routing:\n\n```python\nimport hashlib\n\ndef route_to_deployment(user_id, traffic_fraction=0.2):\n \"\"\"Consistent routing for deployment migration\"\"\"\n \n hashed_user_id = int(hashlib.md5(user_id.encode()).hexdigest(), 16)\n max_hash = 2**128 - 1\n ratio = hashed_user_id / max_hash\n \n if ratio < traffic_fraction:\n return \"new-deployment-id\"\n else:\n return \"old-deployment-id\"\n\n# Usage\nuser_id = \"user-123\"\ndeployment_id = route_to_deployment(user_id, 0.2)\n```\n\n## 6. Monitoring and Debugging\n\n### Check Deployment Status\n```python\nfrom fireworks import LLM\n\nllm = LLM(\n model=\"llama-v3p1-8b-instruct\",\n deployment_type=\"on-demand\",\n id=\"my-deployment\"\n)\n\n# Get deployment status\nstatus = llm.get_deployment_status()\nprint(f\"Status: {status.state}\")\nprint(f\"Replicas: {status.replica_count}\")\nprint(f\"URL: {llm.deployment_url}\")\n```\n\n### Performance Monitoring\n```python\n# Enable performance metrics\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}],\n perf_metrics_in_response=True\n)\n\nif hasattr(response, 'perf_metrics'):\n print(\"Performance metrics:\", response.perf_metrics)\n```\n\n## Key Takeaways\n\n1. **Use the Build SDK** for the best development experience\n2. **Serverless deployments** are easiest - no management needed\n3. **On-demand deployments** require `.apply()` calls and manual cleanup\n4. **Monitor costs** - on-demand deployments bill by GPU-second even when idle\n5. **Use scale-to-zero** to minimize costs during low usage\n6. **Track deployments** using the web dashboard at https://app.fireworks.ai/dashboard/deployments\n\nThis comprehensive approach covers all aspects of deployment management on Fireworks AI, from basic creation to advanced monitoring and cost optimization.","tool_calls":[]}],"input_metadata":{"row_id":"experiment-safe-anger-lot"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T13:05:03.474251"} -{"messages":[{"role":"system","content":"You are a helpful assistant that can answer questions about Fireworks.\nALWAYS provide code or commands to execute to answer the question."},{"role":"user","content":"Can you teach me about how to manage deployments on Fireworks"},{"role":"assistant","content":"I'll help you learn about managing deployments on Fireworks. Let me search for comprehensive information about deployment management.","tool_calls":[{"id":"functions.search:0","function":{"arguments":"{\"query\": \"manage deployments Fireworks AI deployment lifecycle\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Fireworks AI Developer Platform\nLink: https://docs.fireworks.ai/getting-started/introduction\nContent: Fireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\nFireworks AI is the best platform for building AI product experiences with open source AI models. You can run and customize AI models with just a few lines of code!\n\n","type":"text"},{"text":"Title: How do I close my Fireworks.ai account?\nLink: https://docs.fireworks.ai/faq-new/account-access/how-do-i-close-my-fireworksai-account\nContent: To close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\nHow do I close my Fireworks.ai account?\nTo close your account: Email inquiries@fireworks.ai Include in your request: Your account ID A clear request for account deletion Before closing your account, please ensure: All outstanding invoices are paid Any active deployments are terminated Important data is backed up if needed\n\n","type":"text"},{"text":"Title: Do you host your deployments in the EU or Asia?\nLink: https://docs.fireworks.ai/faq-new/support-general/do-you-host-your-deployments-in-the-eu-or-asia\nContent: We are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\nDo you host your deployments in the EU or Asia?\nWe are currently deployed in multiple U.S.-based locations. However, we’re open to hearing more about your specific requirements. You can: Join our Discord community Write to us at inquiries@fireworks.ai If you're an Enterprise customer, please contact your dedicated customer support representative to ensure a timely response.\n\n","type":"text"},{"text":"Title: Introducing the Fireworks Build SDK\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-introduction\nContent: The Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\nThe Fireworks Build SDK is a client library that allows you to interact with the Fireworks API using Python. It provides a simple and intuitive interface for working with Fireworks primitives like deployments, fine-tuning jobs, and datasets as Python objects. The Build SDK is currently in beta and not all functionality may be supported. Please reach out to dhuang@fireworks.ai to report any issues or feedback.\n\n","type":"text"},{"text":"Title: On-demand deployments\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: If you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\nIf you plan on using a significant amount of dedicated deployments, consider purchasing reserved capacity instead of using on-demand deployments for more reliable capacity and higher GPU quotas. Fireworks allows you to create on-demand deployments of models that are reserved for your own use and billed by the GPU-second. This has several advantages over the shared deployment architecture you get when using Fireworks' serverless models: Predictable performance unaffected by load caused by other users No hard rate limits, but subject to the maximum load capacity of the deployment Cheaper under high utilization Access to larger selection of models not available via our serverless models Custom base models from Hugging Face files Unlike serverless models, which are billed on a per-token basis, on-demand deployments are billed by GPU-second. Consult our pricing page for details.\n\n","type":"text"},{"text":"Title: I have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nLink: https://docs.fireworks.ai/faq-new/account-access/i-have-multiple-fireworks-accounts-when-i-try-to-login-with-google-on-fireworks\nContent: If you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\nI have multiple Fireworks accounts. When I try to login with Google on Fireworks' web UI, I'm getting signed into the wrong account. How do I fix this?\nIf you log in with Google, account management is controlled by Google. You can log in through an incognito mode or create separate Chrome/browser profiles to log in with different Google accounts. You could also follow the steps in this guide to disassociate Fireworks.ai with a particular Google account sign-in. If you have more complex issues please contact us on Discord.\n\n","type":"text"},{"text":"Title: How much does Fireworks cost?\nLink: https://docs.fireworks.ai/faq-new/billing-pricing/how-much-does-fireworks-cost\nContent: Fireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\nHow much does Fireworks cost?\nFireworks AI operates on a pay-as-you-go model for all non-Enterprise usage, and new users automatically receive free credits. You pay based on: Per token for serverless inference Per GPU usage time for on-demand deployments Per token of training data for fine-tuning For customers needing enterprise-grade security and reliability , please reach out to us at inquiries@fireworks.ai to discuss options. Find out more about our current pricing on our Pricing page.\n\n","type":"text"},{"text":"Title: Introduction\nLink: https://docs.fireworks.ai/api-reference/introduction\nContent: Fireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\nIntroduction\nFireworks AI REST API enables you to interact with various language, image and embedding models using an API Key. It also lets you automate management of models, deployments, datasets, and more.\n\n","type":"text"},{"text":"Title: Control plane and data plane\nLink: https://docs.fireworks.ai/getting-started/concepts\nContent: The Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\nThe Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\nThe Fireworks API can be split into a control plane and a data plane. The control plane consists of APIs used for managing the lifecycle of resources. This\nincludes your account, models, and deployments. The data plane consists of the APIs used for inference and the backend services that power\nthem.\n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Create a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\nCreate a Deployment on Fireworks AI platform\n\n","type":"text"}],"tool_call_id":"functions.search:0"},{"role":"assistant","content":"Let me search for more specific information about deployment management commands and workflows.","tool_calls":[{"id":"functions.search:1","function":{"arguments":"{\"query\": \"deployment management commands firectl CLI create update delete scale deployments\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: Why am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nLink: https://docs.fireworks.ai/faq-new/fine-tuning/why-am-i-getting-invalid-id-errors-when-using-firectl-commands-like-create-deplo\nContent: This error typically occurs when your account ID is not properly configured.\n\nThis error typically occurs when your account ID is not properly configured.\n\nWhy am I getting \"invalid id\" errors when using firectl commands like create deployment or list deployments?\nThis error typically occurs when your account ID is not properly configured.\n\n","type":"text"},{"text":"Title: Creating an on-demand deployment\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: Choose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\nChoose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\nChoose a model Check out our model library to see a list of models available for on-demand deployment. You can also upload and use your own custom base model. Create a deployment To create a new deployment of a model from the model library, use: Or, for a custom base model you have uploaded to your account: This command will complete when the deployment is READY . To let it run asynchronously, remove the --wait flag. If your account has purchased reserved capacity and this deployment meets the reservation criteria, it will be counted against that reservation and not billed as an on-demand deployment. Verify the deployment is running You can verify the deployment is active by running: The state field should show READY. The deployment ID is the last part of the deployment name: accounts//deployments/. You can also list all deployments in your account at any time by running: Query the deployment To query a specific deployment of a model, use the model identifier in the format: /#/ Be sure to include the #/ in the model identifier when querying a specific deployment. Sample Request: Tear down the deployment By default, deployments will automatically scale down to zero replicas if unused (i.e. no\ninference requests) for 1 hour, and automatically delete itself if unused for one week. To completely delete the deployment, run: firectl delete deployment \n\n","type":"text"},{"text":"Title: Create a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/create-deployment\nContent: Creates a new deployment. firectl create deployment [flags]\n\nCreates a new deployment. firectl create deployment [flags]\n\nCreates a new deployment. firectl create deployment [flags]\n\n","type":"text"},{"text":"Title: Delete a deployment\nLink: https://docs.fireworks.ai/tools-sdks/firectl/commands/delete-resources\nContent: Deletes an model deployment. firectl delete deployment [flags]\n\nDeletes an model deployment. firectl delete deployment [flags]\n\nDeletes an model deployment. firectl delete deployment [flags]\n\n","type":"text"},{"text":"Title: Cli overview\nLink: https://docs.fireworks.ai/evaluators/cli_reference/cli_overview\nContent: Command Line Interface Reference\nThe Reward Kit provides a command-line interface (CLI) for common operations like previewing evaluations, deploying reward functions, and running agent evaluations.\n\nCommand Line Interface Reference\nThe Reward Kit provides a command-line interface (CLI) for common operations like previewing evaluations, deploying reward functions, and running agent evaluations.\n\nCommand Overview\nThe Reward Kit CLI supports the following main commands: run : Run a local evaluation pipeline using a Hydra configuration. preview : Preview evaluation results or re-evaluate generated outputs. deploy : Deploy a reward function as an evaluator. agent-eval : Run agent evaluations on task bundles. list : List existing evaluators (coming soon). delete : Delete an evaluator (coming soon).\n\n","type":"text"},{"text":"Title: Deployment Command\nLink: https://docs.fireworks.ai/evaluators/examples/gcp_cloud_run_deployment_example\nContent: It's recommended to run the deployment command from the directory containing the reward function script ( dummy_rewards.py ) and your rewardkit.yaml (if used), for example, from examples/gcp_cloud_run_deployment_example/. Ensure your virtual environment is active: Run the deployment command: Command Explanation: --id my-dummy-gcp-evaluator : A unique ID for your evaluator on the Fireworks AI platform. --target gcp-cloud-run : Specifies deployment to GCP Cloud Run. --function-ref dummy_rewards.hello_world_reward : The Python import path to your reward function. If dummy_rewards.py is in the current directory, this reference works. --gcp-auth-mode api-key : Configures the Cloud Run service with API key authentication. reward-kit will generate a key, store it in GCP Secret Manager, and configure the service. The key is also saved to your local rewardkit.yaml under evaluator_endpoint_keys . This is the default if not specified. --verbose : Shows detailed output, including gcloud commands being executed. --force : (Optional) If an evaluator with the same --id already exists, this flag will delete the existing one before creating the new one.\n\nIt's recommended to run the deployment command from the directory containing the reward function script ( dummy_rewards.py ) and your rewardkit.yaml (if used), for example, from examples/gcp_cloud_run_deployment_example/. Ensure your virtual environment is active: Run the deployment command: Command Explanation: --id my-dummy-gcp-evaluator : A unique ID for your evaluator on the Fireworks AI platform. --target gcp-cloud-run : Specifies deployment to GCP Cloud Run. --function-ref dummy_rewards.hello_world_reward : The Python import path to your reward function. If dummy_rewards.py is in the current directory, this reference works. --gcp-auth-mode api-key : Configures the Cloud Run service with API key authentication. reward-kit will generate a key, store it in GCP Secret Manager, and configure the service. The key is also saved to your local rewardkit.yaml under evaluator_endpoint_keys . This is the default if not specified. --verbose : Shows detailed output, including gcloud commands being executed. --force : (Optional) If an evaluator with the same --id already exists, this flag will delete the existing one before creating the new one.\n\nrewardkit.yaml Configuration (Optional but Recommended)\nThe reward-kit CLI can pick up GCP settings from a rewardkit.yaml file located in the directory from which you run the reward-kit deploy command. Create rewardkit.yaml :\nYou can copy the examples/gcp_cloud_run_deployment_example/rewardkit.example.yaml to the directory where you intend to run reward-kit deploy (this could be the example directory itself, or your project root). Rename it to rewardkit.yaml. Customize rewardkit.yaml :\nOpen rewardkit.yaml and replace placeholders with your actual GCP Project ID and desired region.\nExample rewardkit.yaml: Note : If you choose not to use a rewardkit.yaml file, you must provide all necessary GCP parameters (like --gcp-project YOUR_PROJECT_ID , --gcp-region YOUR_REGION ) directly in the reward-kit deploy command.\n\n","type":"text"},{"text":"Title: Delete Deployment\nLink: https://docs.fireworks.ai/api-reference/delete-deployment\nContent: \n\n\n\nREST Endpoint DELETE /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\nquery params:\nhard:\n\tboolean\n\tDescription: If true, this will perform a hard deletion.\n\tExample: true\nignoreChecks:\n\tboolean\n\tDescription: If true, this will ignore checks and force the deletion of a deployment that is currently\ndeployed and is in use.\n\tExample: true\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {}\n\n","type":"text"},{"text":"Title: 🚀 Easier & faster LoRA fine-tune deployments on Fireworks\nLink: https://docs.fireworks.ai/updates/changelog\nContent: You can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\nYou can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\nYou can now deploy a LoRA fine-tune with a single command and get speeds that approximately match the base model: firectl create deployment \"accounts/fireworks/models/\"\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: Deploying a fine-tuned model using an on-demand deployment\nLink: https://docs.fireworks.ai/fine-tuning/fine-tuning-models\nContent: Use the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\nUse the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\nUse the following command to deploy your fine-tuned model using an on-demand deployment: firectl create deployment \n\n","type":"text"}],"tool_call_id":"functions.search:1"},{"role":"assistant","content":"Let me search for more information about listing, scaling, and managing deployments.","tool_calls":[{"id":"functions.search:2","function":{"arguments":"{\"query\": \"list deployments scale deployment update deployment configuration autoscaling\"}","name":"search"},"type":"function"}]},{"role":"tool","content":[{"text":"Title: How does billing work for on-demand deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-work-for-on-demand-deployments\nContent: On-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\nOn-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\nHow does billing work for on-demand deployments?\nOn-demand deployments come with automatic cost optimization features: Default autoscaling : Automatically scales to 0 replicas when not in use Pay for what you use : Charged only for GPU time when replicas are active Flexible configuration : Customize autoscaling behavior to match your needs Best practices for cost management: Leverage default autoscaling : The system automatically scales down deployments when not in use Customize carefully : While you can modify autoscaling behavior using our configuration options , note that preventing scale-to-zero will result in continuous GPU charges Consider your use case : For intermittent or low-frequency usage, serverless deployments might be more cost-effective For detailed configuration options, see our deployment guide.\n\n","type":"text"},{"text":"Title: How does billing and scaling work for on-demand GPU deployments?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-billing-and-scaling-work-for-on-demand-gpu-deployments\nContent: On-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\nHow does billing and scaling work for on-demand GPU deployments?\nOn-demand GPU deployments have unique billing and scaling characteristics compared to serverless deployments: Billing: Charges start when the server begins accepting requests Billed by GPU-second for each active instance Costs accumulate even if there are no active API calls Scaling options: Supports autoscaling from 0 to multiple GPUs Each additional GPU adds to the billing rate Can handle unlimited requests within the GPU’s capacity Management requirements: Not fully serverless; requires some manual management Manually delete deployments when no longer needed Or configure autoscaling to scale down to 0 during inactive periods Cost control tips: Regularly monitor active deployments Delete unused deployments to avoid unnecessary costs Consider serverless options for intermittent usage Use autoscaling to 0 to optimize costs during low-demand times\n\n","type":"text"},{"text":"Title: How does autoscaling affect my costs?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/how-does-autoscaling-affect-my-costs\nContent: Scaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\nScaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\nHow does autoscaling affect my costs?\nScaling from 0 : No minimum cost when scaled to zero Scaling up : Each new replica adds to your total cost proportionally. For example: Scaling from 1 to 2 replicas doubles your GPU costs If each replica uses multiple GPUs, costs scale accordingly (e.g., scaling from 1 to 2 replicas with 2 GPUs each means paying for 4 GPUs total) For current pricing details, please visit our pricing page.\n\n","type":"text"},{"text":"Title: Customizing autoscaling behavior\nLink: https://docs.fireworks.ai/guides/ondemand-deployments\nContent: You can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\nYou can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\nYou can customize certain aspects of the deployment's autoscaling behavior by setting the following flags: --scale-up-window The duration the autoscaler will wait before scaling up a deployment after observing increased load. Default is 30s. --scale-down-window The duration the autoscaler will wait before scaling down a deployment after observing decreased load. Default is 10m. --scale-to-zero-window The duration after which there are no requests that the deployment will be scaled down to zero replicas. This is ignored if --min-replica-count is greater than 0. Default is 1h . The minimum is 5m. --load-targets =[,=...] Load target thresholds for scaling the replica count. If not specified, the load target is default with --load-targets default=0.8 . If multiple load targets are specified the maximum replica count across all of them is used. default= - A general default value for 0 to 1 load targets. Default is default=0.8. tokens_generated_per_second= - The desired tokens generated per second per replica. There will be a cold-start latency (up to a few minutes) for requests made while the deployment is scaling from 0 to 1 replicas. A deployment with --min-replica-count set to 0 will be automatically deleted if it receives no traffic for 7 days. Refer to time.ParseDuration for valid syntax for the duration string.\n\n","type":"text"},{"text":"Title: What should I expect for deployment and scaling performance?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/what-should-i-expect-for-deployment-and-scaling-performance\nContent: Initial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\nWhat should I expect for deployment and scaling performance?\nInitial deployment : Should complete within minutes Scaling from zero : You may experience brief availability delays while the system scales up Troubleshooting : If deployment takes over 1 hour, this typically indicates a crash and should be investigated Best practice : Monitor deployment status and contact support if deployment times are unusually long\n\n","type":"text"},{"text":"Title: Update Deployment\nLink: https://docs.fireworks.ai/api-reference/update-deployment\nContent: \n\n\n\nREST Endpoint PATCH /v1/accounts/{account_id}/deployments/{deployment_id}\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\ndeployment_id:\n\tstring\n\tDescription: The Deployment Id\n\tExample: \"\"\n\n\nRequest body: object\n\tDescription: N/A\n\tExample: {\"displayName\":\"\",\"description\":\"\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"minReplicaCount\":123,\"maxReplicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"disableDeploymentSizeValidation\":true}\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}\n\n","type":"text"},{"text":"Title: Do you support Auto Scaling?\nLink: https://docs.fireworks.ai/faq-new/deployment-infrastructure/do-you-support-auto-scaling\nContent: Yes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\nYes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\nDo you support Auto Scaling?\nYes, our system supports auto scaling with the following features: Scaling down to zero capability for resource efficiency Controllable scale-up and scale-down velocity Custom scaling rules and thresholds to match your specific needs\n\n","type":"text"},{"text":"Title: List Deployments\nLink: https://docs.fireworks.ai/api-reference/list-deployments\nContent: \n\n\n\nREST Endpoint GET /v1/accounts/{account_id}/deployments\n\nServer(s): https://api.fireworks.ai\n\n\nSummary: \n\nDescription: N/A\n\nSecurity methods: \nheader: \n\tAuthorization: bearer auth\n\t\n\nRequest params: \npath params:\naccount_id:\n\tstring\n\tDescription: The Account Id\n\tExample: \"\"\n\nquery params:\npageSize:\n\tinteger\n\tDescription: The maximum number of deployments to return. The maximum page_size is 200,\nvalues above 200 will be coerced to 200.\nIf unspecified, the default is 50.\n\tExample: 123\npageToken:\n\tstring\n\tDescription: A page token, received from a previous ListDeployments call. Provide this\nto retrieve the subsequent page. When paginating, all other parameters\nprovided to ListDeployments must match the call that provided the page\ntoken.\n\tExample: \"\"\nfilter:\n\tstring\n\tDescription: Only deployment satisfying the provided filter (if specified) will be\nreturned. See https://google.aip.dev/160 for the filter grammar.\n\tExample: \"\"\norderBy:\n\tstring\n\tDescription: A comma-separated list of fields to order by. e.g. \"foo,bar\"\nThe default sort order is ascending. To specify a descending order for a\nfield, append a \" desc\" suffix. e.g. \"foo desc,bar\"\nSubfields are specified with a \".\" character. e.g. \"foo.bar\"\nIf not specified, the default order is by \"create_time\".\n\tExample: \"\"\nshowDeleted:\n\tboolean\n\tDescription: If set, DELETED deployments will be included.\n\tExample: true\nreadMask:\n\tstring\n\tDescription: The fields to be returned in the response. If empty or \"*\", all fields will be returned.\n\tExample: \"\"\n\n\nRequest body: N/A\n\n\nResponses: \n200: object\n\tDescription: N/A\n\tExample: {\"deployments\":[{\"name\":\"\",\"displayName\":\"\",\"description\":\"\",\"createTime\":\"2023-11-07T05:31:56Z\",\"expireTime\":\"2023-11-07T05:31:56Z\",\"purgeTime\":\"2023-11-07T05:31:56Z\",\"deleteTime\":\"2023-11-07T05:31:56Z\",\"state\":\"STATE_UNSPECIFIED\",\"status\":{\"code\":\"OK\",\"message\":\"\"},\"minReplicaCount\":123,\"maxReplicaCount\":123,\"replicaCount\":123,\"autoscalingPolicy\":{\"scaleUpWindow\":\"\",\"scaleDownWindow\":\"\",\"scaleToZeroWindow\":\"\",\"loadTargets\":{}},\"baseModel\":\"\",\"acceleratorCount\":123,\"acceleratorType\":\"ACCELERATOR_TYPE_UNSPECIFIED\",\"precision\":\"PRECISION_UNSPECIFIED\",\"cluster\":\"\",\"enableAddons\":true,\"draftTokenCount\":123,\"draftModel\":\"\",\"ngramSpeculationLength\":123,\"numPeftDeviceCached\":123,\"deploymentTemplate\":\"\",\"autoTune\":{\"longPrompt\":true},\"placement\":{\"region\":\"REGION_UNSPECIFIED\",\"multiRegion\":\"MULTI_REGION_UNSPECIFIED\",\"regions\":[\"REGION_UNSPECIFIED\"]},\"region\":\"REGION_UNSPECIFIED\",\"updateTime\":\"2023-11-07T05:31:56Z\",\"disableDeploymentSizeValidation\":true}],\"nextPageToken\":\"\",\"totalSize\":123}\n\n","type":"text"},{"text":"Title: Deployment type selection\nLink: https://docs.fireworks.ai/tools-sdks/python-client/sdk-basics\nContent: The SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\nThe SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\nThe SDK tries to be parsimonious with the way it deploys resources. We provide two types of deployment options on Fireworks: serverless hosting is enabled for some commonly-used state of the art models. The pricing for these models is per-token, i.e. you only pay for the tokens you use, and subject to rate limits. on-demand hosting is enabled for all other models. The pricing for these models is per GPU-second. This hosting is required for models that are not available serverlessly or workloads that exceed serverless rate limits. For non-finetuned models, you can always specify the deployment type of LLM() by passing either \"serverless\" or \"on-demand\" as the deployment_type parameter to the constructor. If the model is not available for the deployment type you selected, the SDK will throw an error. The SDK can also decide the best deployment strategy on your behalf, just pass deployment_type=\"auto\" . If the model is available serverlessly, the SDK will use serverless hosting, otherwise the SDK will create an on-demand deployment. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" deployments. While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. For finetuned (LoRA) models, passing deployment_type=\"serverless\" will try to deploy the finetuned model to serverless hosting, deployment_type=\"on-demand\" will create an on-demand deployment of your base model and merge in your LoRA weights, deployment_type=\"on-demand-lora\" will create an on-demand deployment with Multi-LoRA enabled, and deployment_type=\"auto\" will try to use serverless if available, otherwise fall back to on-demand-lora.\n\n","type":"text"},{"text":"Title: 2. Call a language model using the LLM() class\nLink: https://docs.fireworks.ai/tools-sdks/python-client/the-tutorial\nContent: Now that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. The great thing about the SDK is that you can use your favorite Python constructs to powerfully work with LLMs. For example, let's try calling a few LLMs in a loop and see how they respond: from fireworks import LLM\n\nllms = [\n \"llama4-maverick-instruct-basic\",\n \"deepseek-r1\",\n \"qwen2p5-vl-32b-instruct\"\n]\n\nfor llm in llms:\n llm = LLM(model=llm, deployment_type=\"auto\") \n print(\"\\n\" + \"-\" * 100)\n print(f\"Model: {llm.model}\")\n print(\"-\" * 100 + \"\\n\")\n\n response = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}]\n )\n print(response.choices[0].message.content)\n\nNow that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. from fireworks import LLM\n\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\") \n\nresponse = llm.chat.completions.create(\n messages=[{\"role\": \"user\", \"content\": \"Hello, world!\"}]\n)\n\nprint(response.choices[0].message.content)\n\nNow that your machine is setup with credentials and the SDK, lets ensure you are\nready to make your first LLM call and explain some of the nuances of this SDK. Create a new file called main.py and import the Fireworks AI SDK. Instantiate the LLM class. The LLM class accepts a model argument that you\ncan use to specify the model you want to use. For this tutorial, we will use the\nLlama 4 Maverick\nmodel. When creating an LLM instance, you can specify the deployment type as either \"serverless\" , \"on-demand\" , or \"auto\" . If you pass \"auto\" , the SDK will try to use serverless hosting if available, otherwise it will create an on-demand deployment. In the other cases, the SDK will try to create a deployment of the specified type and will throw an error if it's not available for the model you selected. The SDK will try and re-use existing deployments for the same model if possible, see Resource management for more details. With great power comes great responsibility! Be careful with the deployment_type parameter, especially for \"auto\" and \"on-demand\" . While the SDK will try to make the most cost effective choice for you and put sensible autoscaling policies in place, it is possible to unintentionally create many deployments that lead to unwanted spend, especially when working with non-serverless models. When using deployment_type=\"on-demand\" , you must provide an id parameter to uniquely identify your deployment. This is required to prevent accidental creation of multiple deployments. When using deployment_type=\"on-demand\" or deployment_type=\"on-demand-lora\" , you must call .apply() to apply the deployment configuration to Fireworks. This is not required for serverless deployments. When using deployment_type=\"auto\" , the SDK will automatically handle deployment creation, but if it falls back to on-demand deployment, you may need to call .apply() explicitly. If you do not call .apply() , you are expected to set up the deployment through the deployment page at https://app.fireworks.ai/dashboard/deployments. Make a request to the LLM. The LLM class is OpenAI compatible, so you can use\nthe same chat completion interface to make a request to the LLM. Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?\n\n","type":"text"}],"tool_call_id":"functions.search:2"},{"role":"assistant","content":"Based on my research, here's a comprehensive guide to managing deployments on Fireworks AI:\n\n## Understanding Fireworks AI Deployments\n\nFireworks AI offers **two types of deployments**:\n\n1. **Serverless deployments** - Pay-per-token, rate-limited, fully managed\n2. **On-demand deployments** - Pay-per-GPU-second, dedicated resources, more control\n\n## Managing Deployments with firectl CLI\n\n### 1. Creating Deployments\n\n**Basic deployment creation:**\n```bash\n# Create a deployment from model library\nfirectl create deployment --wait\n\n# Create deployment for custom model\nfirectl create deployment accounts//models/ --wait\n\n# Create deployment with custom configuration\nfirectl create deployment \\\n --min-replica-count 1 \\\n --max-replica-count 4 \\\n --scale-to-zero-window 30m\n```\n\n**Deploy fine-tuned models:**\n```bash\n# Deploy a LoRA fine-tuned model\nfirectl create deployment \n```\n\n### 2. Listing and Monitoring Deployments\n\n```bash\n# List all deployments\nfirectl list deployments\n\n# Get deployment details\nfirectl get deployment \n\n# Check deployment status (should show \"READY\")\nfirectl get deployment -o json | jq '.state'\n```\n\n### 3. Scaling and Autoscaling Configuration\n\n**Custom autoscaling behavior:**\n```bash\nfirectl create deployment \\\n --scale-up-window 60s \\\n --scale-down-window 15m \\\n --scale-to-zero-window 2h \\\n --load-targets default=0.7,tokens_generated_per_second=100\n```\n\n**Manual scaling:**\n```bash\n# Update deployment configuration\nfirectl update deployment \\\n --min-replica-count 2 \\\n --max-replica-count 8\n```\n\n### 4. Deleting Deployments\n\n```bash\n# Delete a specific deployment\nfirectl delete deployment \n\n# Force delete (ignores usage checks)\nfirectl delete deployment --ignore-checks\n```\n\n## Managing Deployments via REST API\n\n### List deployments:\n```bash\ncurl -X GET \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments\" \\\n -H \"Authorization: Bearer {API_KEY}\"\n```\n\n### Update deployment:\n```bash\ncurl -X PATCH \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer {API_KEY}\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"minReplicaCount\": 2,\n \"maxReplicaCount\": 6,\n \"autoscalingPolicy\": {\n \"scaleToZeroWindow\": \"30m\",\n \"loadTargets\": {\"default\": 0.8}\n }\n }'\n```\n\n### Delete deployment:\n```bash\ncurl -X DELETE \\\n \"https://api.fireworks.ai/v1/accounts/{account_id}/deployments/{deployment_id}\" \\\n -H \"Authorization: Bearer {API_KEY}\"\n```\n\n## Managing Deployments with Python SDK\n\n```python\nfrom fireworks import LLM\n\n# Auto-select deployment type\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"auto\")\n\n# Explicit on-demand deployment\nllm = LLM(\n model=\"llama4-maverick-instruct-basic\", \n deployment_type=\"on-demand\",\n id=\"my-unique-deployment-id\"\n)\nllm.apply() # Required for on-demand deployments\n\n# Serverless deployment (no apply needed)\nllm = LLM(model=\"llama4-maverick-instruct-basic\", deployment_type=\"serverless\")\n```\n\n## Cost Management Best Practices\n\n### Autoscaling Configuration:\n- **Default behavior**: Scales to 0 after 1 hour of inactivity\n- **Custom scale-to-zero**: Set `--scale-to-zero-window` from 5m to customize\n- **Cost optimization**: Use autoscaling to 0 for intermittent workloads\n\n### Monitoring Costs:\n```bash\n# Check active deployments regularly\nfirectl list deployments\n\n# Monitor GPU usage and costs\n# Deployments auto-delete after 7 days of no traffic\n```\n\n### Reserved Capacity:\nFor high-volume usage, consider **reserved capacity** instead of on-demand:\n- More reliable capacity\n- Higher GPU quotas\n- Better pricing for consistent workloads\n\n## Key Management Commands Summary\n\n| Operation | Command |\n|-----------|---------|\n| **Create** | `firectl create deployment ` |\n| **List** | `firectl list deployments` |\n| **Get** | `firectl get deployment ` |\n| **Update** | `firectl update deployment ` |\n| **Delete** | `firectl delete deployment ` |\n| **Scale** | Use `--min-replica-count` and `--max-replica-count` flags |\n\n## Important Notes\n\n- **Automatic cleanup**: Deployments auto-scale to 0 after 1h inactivity, auto-delete after 7 days\n- **Cold start**: Expect 1-3 minutes when scaling from 0 to 1 replicas\n- **Billing**: Starts when server accepts requests, continues while replicas are active\n- **Rate limits**: On-demand deployments have no hard rate limits (within GPU capacity)\n\nThis comprehensive guide covers all aspects of deployment management on Fireworks AI. Start with simple commands and gradually explore advanced configuration options as your needs grow!","tool_calls":[]}],"input_metadata":{"row_id":"wait-warm-people-child"},"evaluation_result":{"score":1.0,"is_score_valid":true,"reason":"At least one tool call was made","metrics":{}},"created_at":"2025-08-05T13:05:54.247652"} diff --git a/.gitignore b/.gitignore index acb89bc4..9e8d9637 100644 --- a/.gitignore +++ b/.gitignore @@ -160,6 +160,7 @@ cython_debug/ # Specific to this project (can be kept or reviewed) firectl references +.eval_protocol samples.json # If this is a specific file to ignore From ee20bfe898e394c76c7ab40c9b6063895b7efd97 Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:47:44 -0700 Subject: [PATCH 51/54] Update test_pytest_mcp_config.py docstring to clarify test purpose for Stdio MCP Config usage in decorator --- tests/pytest/test_pytest_mcp_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pytest/test_pytest_mcp_config.py b/tests/pytest/test_pytest_mcp_config.py index 6446af9d..475d74e2 100644 --- a/tests/pytest/test_pytest_mcp_config.py +++ b/tests/pytest/test_pytest_mcp_config.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List -from eval_protocol.models import EvaluateResult, Message, EvaluationRow +from eval_protocol.models import EvaluateResult, EvaluationRow, Message from eval_protocol.pytest import default_agent_rollout_processor, evaluation_test @@ -25,7 +25,7 @@ mcp_config_path="tests/pytest/mcp_configurations/mock_discord_mcp_config.json", ) def test_pytest_mcp_config(row: EvaluationRow) -> EvaluationRow: - """Run math evaluation on sample dataset using pytest interface.""" + """Test Stdio MCP Config usage in decorator""" # filter for all tool calls tool_calls = [msg for msg in row.messages if msg.role == "tool"] From 7ea70072fddf95bf11cbfdae33f6d9720bfe4d2e Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 18:48:55 -0700 Subject: [PATCH 52/54] Remove redundant Metadata header from Row component for cleaner UI. --- vite-app/src/components/Row.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vite-app/src/components/Row.tsx b/vite-app/src/components/Row.tsx index e9c693cc..6b1cd52b 100644 --- a/vite-app/src/components/Row.tsx +++ b/vite-app/src/components/Row.tsx @@ -119,10 +119,6 @@ export const Row = observer( {/* Right Column - Metadata */}
-

- Metadata -

- {/* Eval Metadata */} Date: Tue, 5 Aug 2025 18:50:33 -0700 Subject: [PATCH 53/54] Update ChatInterface component to adjust maximum width calculation for chat window resizing from 80% to 66% of the available width, improving layout responsiveness. --- vite-app/src/components/ChatInterface.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vite-app/src/components/ChatInterface.tsx b/vite-app/src/components/ChatInterface.tsx index ad70ae18..f9741e63 100644 --- a/vite-app/src/components/ChatInterface.tsx +++ b/vite-app/src/components/ChatInterface.tsx @@ -27,13 +27,14 @@ export const ChatInterface = ({ messages }: ChatInterfaceProps) => { const deltaX = e.clientX - initialMouseX; const newWidth = initialWidth + deltaX; - // Calculate max width as 80% of container width + // Calculate max width as 66% of available width + // Get the parent container that has the flex layout + const parentContainer = chatContainerRef.current?.closest(".flex"); const containerWidth = - chatContainerRef.current?.parentElement?.clientWidth || - window.innerWidth; - const maxWidth = containerWidth * 0.8; + parentContainer?.clientWidth || window.innerWidth; + const maxWidth = containerWidth * 0.66; - setChatWidth(Math.max(300, Math.min(maxWidth, newWidth))); // Min 300px, max 80% of container + setChatWidth(Math.max(300, Math.min(maxWidth, newWidth))); // Min 300px, max 70% of container } }; From 5626b88bfe91021b384410b91a2e42ba0b1ebb0a Mon Sep 17 00:00:00 2001 From: Dylan Huang Date: Tue, 5 Aug 2025 19:00:06 -0700 Subject: [PATCH 54/54] make messages more dense --- vite-app/src/components/MessageBubble.tsx | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/vite-app/src/components/MessageBubble.tsx b/vite-app/src/components/MessageBubble.tsx index 69374cd2..2310c11d 100644 --- a/vite-app/src/components/MessageBubble.tsx +++ b/vite-app/src/components/MessageBubble.tsx @@ -8,9 +8,9 @@ export const MessageBubble = ({ message }: { message: Message }) => { const hasFunctionCall = message.function_call; return ( -
+
{ : "bg-yellow-50 border-yellow-200 text-yellow-900" }`} > -
+
{message.role}
-
+
{typeof message.content === "string" ? message.content : Array.isArray(message.content) @@ -36,12 +36,12 @@ export const MessageBubble = ({ message }: { message: Message }) => {
{hasToolCalls && message.tool_calls && (
@@ -50,14 +50,14 @@ export const MessageBubble = ({ message }: { message: Message }) => { {message.tool_calls.map((call, i) => (
@@ -76,26 +76,26 @@ export const MessageBubble = ({ message }: { message: Message }) => { )} {hasFunctionCall && message.function_call && (
Function Call: