llmboost-hub 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,123 @@
1
+ import os
2
+ import time
3
+ import json
4
+ import io
5
+ import pandas as pd
6
+ import requests
7
+ import click
8
+
9
+ from llmboost_hub.utils.config import config
10
+
11
+
12
+ def _cache_is_fresh(path: str, ttl_seconds: int = 60) -> bool:
13
+ try:
14
+ mtime = os.path.getmtime(path)
15
+ return (time.time() - mtime) < ttl_seconds
16
+ except Exception:
17
+ return False
18
+
19
+
20
+ def _write_cache_from_df(cache_path: str, df: pd.DataFrame, verbose: bool = False) -> None:
21
+ try:
22
+ if cache_path.lower().endswith(".json"):
23
+ df.to_json(cache_path, orient="records")
24
+ else:
25
+ df.to_csv(cache_path, index=False)
26
+ except Exception:
27
+ # best-effort cache
28
+ pass
29
+ if verbose:
30
+ click.echo(f"Refreshed cache at {cache_path}")
31
+
32
+
33
+ def _load_df_from_cache(cache_path: str, verbose: bool = False) -> pd.DataFrame:
34
+ try:
35
+ if cache_path.lower().endswith(".json"):
36
+ with open(cache_path, "r", encoding="utf-8") as fh:
37
+ data = json.load(fh)
38
+ return pd.DataFrame(data)
39
+ else:
40
+ return pd.read_csv(cache_path)
41
+ except Exception:
42
+ if verbose:
43
+ click.echo(f"Failed to load cache from {cache_path}")
44
+ return pd.DataFrame()
45
+
46
+
47
+ def _fetch_csv(endpoint: str, params: dict, verbose: bool = False) -> pd.DataFrame:
48
+ # if verbose:
49
+ # click.echo(f"Downloading CSV from {endpoint} with params {params}")
50
+ resp = requests.get(endpoint, params=params, timeout=10)
51
+ if resp.status_code != 200:
52
+ raise click.ClickException(f"Lookup failed ({resp.status_code}): {resp.text}")
53
+ try:
54
+ return pd.read_csv(io.StringIO(resp.text))
55
+ except Exception:
56
+ raise click.ClickException("Lookup returned invalid CSV")
57
+
58
+
59
+ def load_lookup_df(
60
+ endpoint: str,
61
+ query: str,
62
+ verbose: bool = False,
63
+ local_only: bool = False,
64
+ skip_cache_update: bool = False,
65
+ ) -> pd.DataFrame:
66
+ """
67
+ Use the local cache (`config.LBH_LOOKUP_CACHE`) if fresh (age < `config.LBH_LOOKUP_CACHE_TTL`);
68
+ otherwise fetch from `endpoint`.
69
+
70
+ On fetch success:
71
+ - Return DataFrame.
72
+
73
+ On fetch failure:
74
+ - Fall back to the cache (even if stale)
75
+
76
+ On cache failure:
77
+ - Return empty DataFrame.
78
+
79
+ Args:
80
+ endpoint: CSV endpoint URL.
81
+ query: Optional query string to pass to the endpoint (e.g., `q`).
82
+ verbose: If True, log cache and fetch behavior.
83
+ local_only: If True, skip remote fetch and use only local cache.
84
+ skip_cache_update: If True, do not update cache after successful fetch. (Only applies if `local_only=False`.)
85
+
86
+ Returns:
87
+ A pandas DataFrame with columns normalized to lower-case (may be empty).
88
+ """
89
+ cache_path = config.LBH_LOOKUP_CACHE
90
+
91
+ # Fresh cache
92
+ if os.path.exists(cache_path) and _cache_is_fresh(
93
+ cache_path, ttl_seconds=config.LBH_LOOKUP_CACHE_TTL
94
+ ):
95
+ if verbose:
96
+ click.echo(f"Using fresh cache at {cache_path}")
97
+ return _load_df_from_cache(cache_path, verbose=verbose)
98
+
99
+ # Skip fetch remote if local_only
100
+ if not local_only:
101
+ try:
102
+ df = _fetch_csv(endpoint, params={"q": query}, verbose=verbose)
103
+ df.columns = [str(c).strip().lower() for c in df.columns]
104
+ if not skip_cache_update:
105
+ _write_cache_from_df(cache_path, df, verbose=verbose)
106
+ return df
107
+ except click.ClickException as e:
108
+ if verbose:
109
+ click.echo(f"Remote lookup failed: {e}. Falling back to cache/sample.")
110
+ except Exception as e:
111
+ if verbose:
112
+ click.echo(f"Remote error: {e}. Falling back to cache/sample.")
113
+
114
+ # Fallback to cache (even if stale)
115
+ if os.path.exists(cache_path):
116
+ if verbose:
117
+ click.echo(f"Using cached data from {cache_path}")
118
+ return _load_df_from_cache(cache_path, verbose=verbose)
119
+
120
+ # Last resort: generate empty DataFrame
121
+ if verbose:
122
+ click.echo(f"No cache found at {cache_path}.")
123
+ return pd.DataFrame()
@@ -0,0 +1,76 @@
1
+ import os
2
+ from typing import List
3
+
4
+
5
+ def path_has_files(path: str) -> bool:
6
+ """
7
+ Return True if 'path' exists, is a directory, and contains at least one file
8
+ in its subtree (current dir or any nested subdirectory).
9
+
10
+ Args:
11
+ path: Absolute or relative directory path.
12
+
13
+ Returns:
14
+ True if there is at least one regular file somewhere under 'path'; False otherwise.
15
+ """
16
+ # Fast-fail if not a directory
17
+ if not os.path.isdir(path):
18
+ return False
19
+ # Walk the tree and short-circuit as soon as we see any file
20
+ for _, _, files in os.walk(path):
21
+ if files:
22
+ return True
23
+ return False
24
+
25
+
26
+ def is_model_downloaded(models_root: str, model_id: str) -> bool:
27
+ """
28
+ Check if the models root contains a downloaded model directory for `model_id`.
29
+
30
+ Args:
31
+ models_root: Root directory that stores models (e.g., `config.LBH_MODELS`).
32
+ model_id: Model identifier; may include `org/name` or plain name.
33
+
34
+ Returns:
35
+ True if `models_root/model_id` exists and contains at least one file; False otherwise.
36
+ """
37
+ return path_has_files(os.path.join(models_root, str(model_id or "")))
38
+
39
+
40
+ def get_model_name_from_model_id(model_id: str) -> str:
41
+ """
42
+ Get name of model from a Hugging Face style model id.
43
+ Applies following transformations:
44
+ - Remove repo/organization prefix (if present; splits on '/')
45
+ Converts any 'org/name' to just 'name'.
46
+
47
+ Examples:
48
+ 'Org/Model_Name' -> 'Model_name'
49
+ 'model.name' -> 'model.name'
50
+
51
+ Args:
52
+ model_id: Model id such as 'org/name' or 'name'.
53
+
54
+ Returns:
55
+ Normalized model name.
56
+ """
57
+ parts = str(model_id or "").split("/")
58
+ return parts[-1] # get last part after '/'
59
+
60
+
61
+ def get_repo_from_model_id(model_id: str) -> str:
62
+ """
63
+ Extract the organization/user (repo owner) from a Hugging Face style model id.
64
+
65
+ Examples:
66
+ 'org/name' -> 'org'
67
+ 'name' -> '' (no org present)
68
+
69
+ Args:
70
+ model_id: Model id such as 'org/name' or 'name'.
71
+
72
+ Returns:
73
+ The repo/organization segment if present; otherwise an empty string.
74
+ """
75
+ parts = str(model_id or "").split("/")
76
+ return parts[-2] if len(parts) >= 2 else ""
@@ -0,0 +1,3 @@
1
+ # Copyright 2024, MangoBoost, Inc. All rights reserved.
2
+
3
+ BUILD_DATE = "9999-99-99"
@@ -0,0 +1,203 @@
1
+ Metadata-Version: 2.4
2
+ Name: llmboost_hub
3
+ Version: 0.1.1
4
+ Summary: A lightweight CLI tool for managing LLMBoost model images and environments.
5
+ Author-email: Harish Kambhampaty <harish.kambhampaty@mangoboost.io>
6
+ License: Copyright 2025, MangoBoost, Inc. All rights reserved.
7
+
8
+ Redistribution and modification in source and binary forms is
9
+ strictly prohibited.
10
+
11
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
12
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
13
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
18
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
19
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
21
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ Project-URL: Homepage, https://github.com/mangoboost/llmboost_hub
24
+ Project-URL: Documentation, https://docs.mangoboost.io/llmboost_hub
25
+ Project-URL: Source, https://github.com/mangoboost/llmboost_hub
26
+ Keywords: LLM,Docker,CLI,HPC,AI,LLMBoost
27
+ Classifier: Programming Language :: Python :: 3
28
+ Classifier: Operating System :: OS Independent
29
+ Classifier: Intended Audience :: Developers
30
+ Requires-Python: >=3.8
31
+ Description-Content-Type: text/markdown
32
+ License-File: LICENSE
33
+ Requires-Dist: click>=8.0
34
+ Requires-Dist: requests>=2.31
35
+ Requires-Dist: tabulate>=0.9
36
+ Requires-Dist: rich>=13.7
37
+ Requires-Dist: docker>=7.0
38
+ Requires-Dist: pyyaml>=6.0
39
+ Requires-Dist: pandas>=2.0
40
+ Requires-Dist: licensing
41
+ Requires-Dist: bcrypt>=4.0
42
+ Requires-Dist: huggingface_hub>=0.23
43
+ Requires-Dist: black>=23.1.0
44
+ Provides-Extra: build
45
+ Requires-Dist: build>=1.0.0; extra == "build"
46
+ Requires-Dist: wheel>=0.42; extra == "build"
47
+ Requires-Dist: setuptools>=68.0; extra == "build"
48
+ Requires-Dist: twine>=4.0; extra == "build"
49
+ Provides-Extra: compile
50
+ Requires-Dist: nuitka>=2.1; extra == "compile"
51
+ Provides-Extra: obfuscate
52
+ Requires-Dist: pyarmor>=8.5; extra == "obfuscate"
53
+ Dynamic: license-file
54
+
55
+ # [LLMBoost Hub (lbh)](https://docs.mangoboost.io/llmboost_hub/)
56
+
57
+ Manage LLMBoost™ model containers and environments to run, serve, and tune large language models.
58
+
59
+ ---
60
+
61
+ ## Pre-requisites
62
+
63
+ ### Dependencies:
64
+ - Python 3.10+
65
+ - Docker 27.3.1+
66
+ - NVIDIA GPU: [nvidia-docker2](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) or AMD GPU: [ROCm 6.3+](https://rocm.docs.amd.com/en/latest/Installation_Guide/Installation-Guide.html)
67
+
68
+ ### Install LLMBoost Hub:
69
+
70
+ ```bash
71
+ pip install llmboost_hub
72
+
73
+ # Verify installation
74
+ lbh --version
75
+ ```
76
+
77
+ Note: This document uses `lbh` interchangeably with `llmboost_hub`.
78
+
79
+ ### Login to Hugging Face and Docker:
80
+ ```bash
81
+ huggingface-cli login # or set HF_TOKEN env var
82
+ docker login -u <your_docker_username>
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Quick start
88
+
89
+ One-liner to start serving a model (automatically downloads image and model, if needed):
90
+ ```bash
91
+ lbh serve <Repo/Model-Name> # Full model name (including repository or organization name) must match the name from https://huggingface.co
92
+ ```
93
+
94
+ For example:
95
+ ```bash
96
+ lbh serve meta-llama/Llama-3.1-8B-Instruct
97
+ ```
98
+
99
+ Basic workflow:
100
+ ```bash
101
+ lbh login # authenticate LLMBoost license
102
+ lbh search <model> # find supported models, regex-style match
103
+ lbh prep <Repo/Model-Name> # download image and model assets
104
+ lbh run <Repo/Model-Name> # start container
105
+ lbh serve <Repo/Model-Name> # start LLMBoost server inside container
106
+ lbh test <Repo/Model-Name> # send test request
107
+ lbh stop <Repo/Model-Name> # stop container
108
+ ```
109
+
110
+ For more details, see the [Command Reference](#command-reference) section below.
111
+
112
+ Shell completions:
113
+ ```bash
114
+ eval "$(lbh completions)" # current shell
115
+ lbh completions [--venv|--profile] # persist for venv or profile
116
+ ```
117
+
118
+ ---
119
+
120
+ ## Configuration
121
+
122
+ *llmboost_hub* uses the following environment variables:
123
+
124
+ - `LBH_HOME`: base directory for all *llmboost_hub* data. (defaults: (host) `~/.llmboost_hub` <- (container) `/llmboost_hub`)
125
+ - `LBH_MODELS`: directory for storing and retrieving model assets. (default: `$LBH_HOME/models`)
126
+ - `LBH_WORKSPACE`: mounted user workspace for manually transferring files out of containers. (defaults: (host) `$LBH_HOME/workspace` <- (container) `/user_workspace`)
127
+
128
+ Notes:
129
+ - A configuation file is stored at `$LBH_HOME/config.yaml` with all the above mentioned settings (and other advanced settings).
130
+ - Precedence order for settings: Environment variables > Configuration file > Defaults
131
+ - `LBH_HOME` can only be changed by setting the env var (or in `~/.bashrc`).
132
+ - WARNING: Changing `LBH_HOME` will cause a new data directory to be used, and all configuration will be reset.
133
+ - `HF_TOKEN` is injected automatically when set.
134
+
135
+ ---
136
+
137
+ ## Command Reference
138
+
139
+ Use `lbh -h` for a summary of all commands, and `lbh [COMMAND] -h` for help with a specific command and all available options.
140
+
141
+ Use `lbh -v [COMMAND]` for verbose output with any command; shows useful diagnostic info for troubleshooting.
142
+
143
+ - `lbh login`
144
+ - Reads `$LBH_LICENSE_PATH` or prompts for a token.
145
+ - Validates online and saves the license file.
146
+
147
+ - `lbh search <model>`
148
+ - Fetches latest models supported by LLMBoost.
149
+ - Filters to available GPU.
150
+
151
+ - `lbh list [model]`
152
+ - Lists local images joined with lookup.
153
+ - Shows status:
154
+ - pending: model not prepared; docker image or model assets missing
155
+ - stopped: model prepared but container not running
156
+ - running: container running but idling
157
+ - initializing: container running and starting LLMBoost server
158
+ - serving: LLMBoost server ready to accept requests
159
+ - tuning: autotuner running
160
+
161
+ - `lbh prep <Repo/Model-Name> [--only-verify] [--fresh]`
162
+ - Pulls the image and downloads HF assets.
163
+ - `--only-verify` checks digests and sizes.
164
+ - `--fresh` removes existing image and re-downloads model assets from Hugging Face.
165
+
166
+ - `lbh run <Repo/Model-Name> [OPTIONS] -- [DOCKER FLAGS...]`
167
+ - Resolves and starts the container detached.
168
+ - Mounts `$LBH_HOME` and `$LBH_WORKSPACE`. Injects HF_TOKEN.
169
+ - NVIDIA GPUs use `--gpus all`. AMD maps `/dev/dri` and `/dev/kfd`.
170
+ - Useful options:
171
+ - `--image <image>`: override docker image.
172
+ - `--model_path <model_path>`: override model assets path.
173
+ - `--restart`: restarts container, if already running.
174
+ - Pass extra docker flags after `--`.
175
+
176
+ - `lbh serve <Repo/Model-Name> [--host 0.0.0.0] [--port 8080] [--detached] [--force]`
177
+ - Starts LLMBoost server inside the container.
178
+ - Waits until ready, unless `--detached`.
179
+ - `--force` skips GPU utilization checks (use if GPU utilization is incorrectly reported by NVidia or AMD GPU drivers).
180
+
181
+ - `lbh test <Repo/Model-Name> [--query "..."] [-t N] [--host 127.0.0.1] [--port 8080]`
182
+ - Sends a test request to `/v1/chat/completions`.
183
+
184
+ - `lbh attach <Repo/Model-Name> [-c <container name or ID>]`
185
+ - Opens a shell in the running container.
186
+
187
+ - `lbh stop <Repo/Model-Name> [-c <container name or ID>]`
188
+ - Stops the container.
189
+
190
+ - `lbh status [model]`
191
+ - Shows status and model.
192
+
193
+ - `lbh tune <Repo/Model-Name> [--metrics throughput] [--detached] [--image <image>]`
194
+ - Runs the autotuner.
195
+ - Store results to `$LBH_HOME/inference.db`, and loads this on next `lbh serve`.
196
+
197
+ ---
198
+
199
+ ## Support
200
+
201
+ - Docs: https://docs.mangoboost.io/llmboost_hub/
202
+ - Website: https://docs.mangoboost.io/llmboost_hub/
203
+ - Email: support@mangoboost.io
@@ -0,0 +1,31 @@
1
+ llmboost_hub/cli.py,sha256=dmaQcfbDGpmzfdfS0w7nV92aObUPFBlWf7vf-WLMgz8,1293
2
+ llmboost_hub/commands/attach.py,sha256=9thBR2RJuMbDRoxjCo4KodAsFWqjd6NhBiSrWOvUho4,2619
3
+ llmboost_hub/commands/chat.py,sha256=A0fnInJB5qHqRRBNW0nOsK75zcZCvnzNrscOw8fKSas,2225
4
+ llmboost_hub/commands/completions.py,sha256=y__rLnB-bLQqqZVnXyjwU9CqNv-fcoOjwqTEApRtAUo,8066
5
+ llmboost_hub/commands/list.py,sha256=bCABrBQvIn_V4W6Y45BEmI87Z5Zf1onXOFzIOgyc8W8,10146
6
+ llmboost_hub/commands/login.py,sha256=gqQONUUk9VbErK1TBHbVrSmq__7tk-wtQUksJxQJCrg,2612
7
+ llmboost_hub/commands/prep.py,sha256=31YskfZfzNP2PqeP-3k7sOZYvAq6AhviGV3bBGAfj2s,22164
8
+ llmboost_hub/commands/run.py,sha256=T8CUXGoAJjJRE4rB9RHFOiRMYTuv9XjoZnsI5yuXqUY,17103
9
+ llmboost_hub/commands/search.py,sha256=9YVWjuww2nNndSoBeIpIyW9iwSFZJXt48xATt92DjT0,6035
10
+ llmboost_hub/commands/serve.py,sha256=tcVJE8hZJnV5GCb4vi58KpRs-Kc9Yrz7ICZvWjpsqS8,9618
11
+ llmboost_hub/commands/status.py,sha256=JXAHkRWzn6WKIC4I_KEGjT9WSQuPUJ4e1PwH9ZiiA6E,1193
12
+ llmboost_hub/commands/stop.py,sha256=HFIA8jc06Y4kquNHP8zuNAX1ll8ZraHJ77GlWt3BHW0,1973
13
+ llmboost_hub/commands/test_cmd.py,sha256=Vc5WjpapFYzJtOqBbEd-56E2_OvfJOCrwymzM7P8rs4,1707
14
+ llmboost_hub/commands/tune.py,sha256=kJNICp4ezOBMrShNtOFCOIZj4pnwv9JE0nHa7ZT9IIE,12107
15
+ llmboost_hub/utils/config.py,sha256=KPR5pOWlzDbXqFdb_afSres39IMZCOrCW3Xm-qzaQf8,7602
16
+ llmboost_hub/utils/container_utils.py,sha256=zZEHBqj9bQ628CLhTGeaUggCsNEXwQbOdU81GTseDTo,4313
17
+ llmboost_hub/utils/fs_utils.py,sha256=vcRnvh4pNB2TsU2D5962lB9UEqD0xkPR5w0lpYD6xwI,1016
18
+ llmboost_hub/utils/generate_sample_lookup.py,sha256=-osdHYe_SbvOIsFMRi5hFU00qpllBuqItthLd09hVxs,4108
19
+ llmboost_hub/utils/gpu_info.py,sha256=bqFSDYyGbobG-wYIlBJYzSnf4HoSbp0JYiAzKwqfTg8,7635
20
+ llmboost_hub/utils/license_checker.py,sha256=hJXvetEeMAzN4xACsUSLNPM7VYVhGtn_HvUENO34d4o,13300
21
+ llmboost_hub/utils/license_wrapper.py,sha256=AhJHZmdkVUGUlohTfwBkYF8zsp6pXx7Owo9EL8Qgw-w,3024
22
+ llmboost_hub/utils/llmboost_version.py,sha256=J-j-u0itpEFT6irdmWmixQqYMadNl1X91TxUmoiLHMI,22
23
+ llmboost_hub/utils/lookup_cache.py,sha256=IZ5S-FMn4WfGlW7dpmL14w8sdfJD8wtn51iGnQCntpY,4029
24
+ llmboost_hub/utils/model_utils.py,sha256=818M0d1Y8pQ0gL15bvc1SzAouQhf7jl6zSAu07MgBSM,2243
25
+ llmboost_hub/utils/signature.py,sha256=TlukT_dJ9xXNvV6LUggABMC5-yajPAT7OqmFP9Vg_z0,83
26
+ llmboost_hub-0.1.1.dist-info/licenses/LICENSE,sha256=Bs8AHb5xcW2e0Wh2rAnxkHkVtG6nO1GKuP01mvhNSiw,881
27
+ llmboost_hub-0.1.1.dist-info/METADATA,sha256=rMiyXf7VqXbBmKrVJi0-ccVE-XcmAHcgkksBXNYyeHY,7702
28
+ llmboost_hub-0.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ llmboost_hub-0.1.1.dist-info/entry_points.txt,sha256=zOGSTbgg7ct5h-x-MkhAFfCP-ljKLgXoucw5B1GmuUo,83
30
+ llmboost_hub-0.1.1.dist-info/top_level.txt,sha256=GiutvBTlDMdnX4lMved7C4gi60bjCzqS7vYlKzm_f0w,13
31
+ llmboost_hub-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ lbh = llmboost_hub.cli:main
3
+ llmboost_hub = llmboost_hub.cli:main
@@ -0,0 +1,16 @@
1
+ Copyright 2025, MangoBoost, Inc. All rights reserved.
2
+
3
+ Redistribution and modification in source and binary forms is
4
+ strictly prohibited.
5
+
6
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
7
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
9
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
10
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
11
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
12
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
13
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
14
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
15
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
16
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1 @@
1
+ llmboost_hub