nexaai 1.0.9__cp310-cp310-macosx_14_0_universal2.whl → 1.0.11rc1__cp310-cp310-macosx_14_0_universal2.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.
Potentially problematic release.
This version of nexaai might be problematic. Click here for more details.
- nexaai/_stub.cpython-310-darwin.so +0 -0
- nexaai/_version.py +1 -1
- nexaai/binds/common_bind.cpython-310-darwin.so +0 -0
- nexaai/binds/embedder_bind.cpython-310-darwin.so +0 -0
- nexaai/binds/libnexa_bridge.dylib +0 -0
- nexaai/binds/llm_bind.cpython-310-darwin.so +0 -0
- nexaai/binds/nexa_llama_cpp/libggml-base.dylib +0 -0
- nexaai/binds/nexa_llama_cpp/libggml-cpu.so +0 -0
- nexaai/binds/nexa_llama_cpp/libggml-metal.so +0 -0
- nexaai/binds/nexa_llama_cpp/libggml.dylib +0 -0
- nexaai/binds/nexa_llama_cpp/libllama.dylib +0 -0
- nexaai/binds/nexa_llama_cpp/libmtmd.dylib +0 -0
- nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib +0 -0
- nexaai/binds/nexa_mlx/libnexa_plugin.dylib +0 -0
- nexaai/embedder_impl/mlx_embedder_impl.py +5 -6
- nexaai/mlx_backend/embedding/generate.py +16 -219
- nexaai/mlx_backend/embedding/interface.py +41 -346
- nexaai/mlx_backend/embedding/main.py +35 -126
- nexaai/utils/model_manager.py +87 -103
- nexaai/utils/progress_tracker.py +8 -12
- {nexaai-1.0.9.dist-info → nexaai-1.0.11rc1.dist-info}/METADATA +1 -2
- {nexaai-1.0.9.dist-info → nexaai-1.0.11rc1.dist-info}/RECORD +24 -27
- nexaai/utils/manifest_utils.py +0 -280
- nexaai/utils/model_types.py +0 -47
- nexaai/utils/quantization_utils.py +0 -239
- {nexaai-1.0.9.dist-info → nexaai-1.0.11rc1.dist-info}/WHEEL +0 -0
- {nexaai-1.0.9.dist-info → nexaai-1.0.11rc1.dist-info}/top_level.txt +0 -0
nexaai/utils/model_manager.py
CHANGED
|
@@ -5,22 +5,17 @@ from datetime import datetime
|
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from typing import Optional, Callable, Dict, Any, List, Union
|
|
7
7
|
import functools
|
|
8
|
-
from enum import Enum
|
|
9
8
|
from tqdm.auto import tqdm
|
|
10
9
|
from huggingface_hub import HfApi
|
|
11
10
|
from huggingface_hub.utils import HfHubHTTPError, RepositoryNotFoundError
|
|
12
11
|
|
|
13
12
|
from .progress_tracker import CustomProgressTqdm, DownloadProgressTracker
|
|
14
13
|
from .avatar_fetcher import get_avatar_url_for_repo
|
|
15
|
-
from .manifest_utils import (
|
|
16
|
-
load_download_metadata,
|
|
17
|
-
save_download_metadata,
|
|
18
|
-
save_manifest_with_files_metadata,
|
|
19
|
-
)
|
|
20
14
|
|
|
21
15
|
# Default path for model storage
|
|
22
16
|
DEFAULT_MODEL_SAVING_PATH = "~/.cache/nexa.ai/nexa_sdk/models/"
|
|
23
17
|
|
|
18
|
+
|
|
24
19
|
@dataclass
|
|
25
20
|
class DownloadedModel:
|
|
26
21
|
"""Data class representing a downloaded model with all its metadata."""
|
|
@@ -93,6 +88,30 @@ def _check_for_incomplete_downloads(directory_path: str) -> bool:
|
|
|
93
88
|
# If we can't access the directory, assume download is complete
|
|
94
89
|
return True
|
|
95
90
|
|
|
91
|
+
|
|
92
|
+
def _load_download_metadata(directory_path: str) -> Dict[str, Any]:
|
|
93
|
+
"""Load download metadata from download_metadata.json if it exists."""
|
|
94
|
+
metadata_path = os.path.join(directory_path, 'download_metadata.json')
|
|
95
|
+
if os.path.exists(metadata_path):
|
|
96
|
+
try:
|
|
97
|
+
with open(metadata_path, 'r', encoding='utf-8') as f:
|
|
98
|
+
return json.load(f)
|
|
99
|
+
except (json.JSONDecodeError, IOError):
|
|
100
|
+
pass
|
|
101
|
+
return {}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _save_download_metadata(directory_path: str, metadata: Dict[str, Any]) -> None:
|
|
105
|
+
"""Save download metadata to download_metadata.json."""
|
|
106
|
+
metadata_path = os.path.join(directory_path, 'download_metadata.json')
|
|
107
|
+
try:
|
|
108
|
+
with open(metadata_path, 'w', encoding='utf-8') as f:
|
|
109
|
+
json.dump(metadata, f, indent=2)
|
|
110
|
+
except IOError:
|
|
111
|
+
# If we can't save metadata, don't fail the download
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
|
|
96
115
|
def _get_directory_size_and_files(directory_path: str) -> tuple[int, List[str]]:
|
|
97
116
|
"""Get total size and list of files in a directory."""
|
|
98
117
|
total_size = 0
|
|
@@ -118,13 +137,6 @@ def _get_directory_size_and_files(directory_path: str) -> tuple[int, List[str]]:
|
|
|
118
137
|
return total_size, files
|
|
119
138
|
|
|
120
139
|
|
|
121
|
-
def _has_valid_metadata(directory_path: str) -> bool:
|
|
122
|
-
"""Check if directory has either nexa.manifest or download_metadata.json (for backward compatibility)."""
|
|
123
|
-
manifest_path = os.path.join(directory_path, 'nexa.manifest')
|
|
124
|
-
old_metadata_path = os.path.join(directory_path, 'download_metadata.json')
|
|
125
|
-
return os.path.exists(manifest_path) or os.path.exists(old_metadata_path)
|
|
126
|
-
|
|
127
|
-
|
|
128
140
|
def _scan_for_repo_folders(base_path: str) -> List[DownloadedModel]:
|
|
129
141
|
"""Scan a directory for repository folders and return model information."""
|
|
130
142
|
models = []
|
|
@@ -150,27 +162,24 @@ def _scan_for_repo_folders(base_path: str) -> List[DownloadedModel]:
|
|
|
150
162
|
if os.path.isdir(subitem_path):
|
|
151
163
|
has_subdirs = True
|
|
152
164
|
# This looks like owner/repo structure
|
|
153
|
-
|
|
154
|
-
if
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
repo_id
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
download_time=metadata.get('download_time'),
|
|
172
|
-
avatar_url=metadata.get('avatar_url')
|
|
173
|
-
))
|
|
165
|
+
size_bytes, files = _get_directory_size_and_files(subitem_path)
|
|
166
|
+
if files: # Only include if there are files
|
|
167
|
+
# Check if the download is complete
|
|
168
|
+
download_complete = _check_for_incomplete_downloads(subitem_path)
|
|
169
|
+
# Load metadata if it exists
|
|
170
|
+
metadata = _load_download_metadata(subitem_path)
|
|
171
|
+
models.append(DownloadedModel(
|
|
172
|
+
repo_id=f"{item}/{subitem}",
|
|
173
|
+
files=files,
|
|
174
|
+
folder_type='owner_repo',
|
|
175
|
+
local_path=subitem_path,
|
|
176
|
+
size_bytes=size_bytes,
|
|
177
|
+
file_count=len(files),
|
|
178
|
+
full_repo_download_complete=download_complete,
|
|
179
|
+
pipeline_tag=metadata.get('pipeline_tag'),
|
|
180
|
+
download_time=metadata.get('download_time'),
|
|
181
|
+
avatar_url=metadata.get('avatar_url')
|
|
182
|
+
))
|
|
174
183
|
else:
|
|
175
184
|
direct_files.append(subitem)
|
|
176
185
|
except (OSError, IOError):
|
|
@@ -179,27 +188,24 @@ def _scan_for_repo_folders(base_path: str) -> List[DownloadedModel]:
|
|
|
179
188
|
|
|
180
189
|
# Direct repo folder (no owner structure)
|
|
181
190
|
if not has_subdirs and direct_files:
|
|
182
|
-
|
|
183
|
-
if
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
repo_id
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
download_time=metadata.get('download_time'),
|
|
201
|
-
avatar_url=metadata.get('avatar_url')
|
|
202
|
-
))
|
|
191
|
+
size_bytes, files = _get_directory_size_and_files(item_path)
|
|
192
|
+
if files: # Only include if there are files
|
|
193
|
+
# Check if the download is complete
|
|
194
|
+
download_complete = _check_for_incomplete_downloads(item_path)
|
|
195
|
+
# Load metadata if it exists
|
|
196
|
+
metadata = _load_download_metadata(item_path)
|
|
197
|
+
models.append(DownloadedModel(
|
|
198
|
+
repo_id=item,
|
|
199
|
+
files=files,
|
|
200
|
+
folder_type='direct_repo',
|
|
201
|
+
local_path=item_path,
|
|
202
|
+
size_bytes=size_bytes,
|
|
203
|
+
file_count=len(files),
|
|
204
|
+
full_repo_download_complete=download_complete,
|
|
205
|
+
pipeline_tag=metadata.get('pipeline_tag'),
|
|
206
|
+
download_time=metadata.get('download_time'),
|
|
207
|
+
avatar_url=metadata.get('avatar_url')
|
|
208
|
+
))
|
|
203
209
|
|
|
204
210
|
except (OSError, IOError):
|
|
205
211
|
# Skip if base path can't be accessed
|
|
@@ -729,57 +735,27 @@ class HuggingFaceDownloader:
|
|
|
729
735
|
|
|
730
736
|
def _fetch_and_save_metadata(self, repo_id: str, local_dir: str) -> None:
|
|
731
737
|
"""Fetch model info and save metadata after successful download."""
|
|
732
|
-
# Initialize metadata with defaults to ensure manifest is always created
|
|
733
|
-
old_metadata = {
|
|
734
|
-
'pipeline_tag': "text-generation", # Default to text-generation pipeline-tag
|
|
735
|
-
'download_time': datetime.now().isoformat(),
|
|
736
|
-
'avatar_url': None
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
# Try to fetch additional metadata, but don't let failures prevent manifest creation
|
|
740
738
|
try:
|
|
741
739
|
# Fetch model info to get pipeline_tag
|
|
742
740
|
info = self.api.model_info(repo_id, token=self.token)
|
|
743
|
-
if hasattr(info, 'pipeline_tag')
|
|
744
|
-
|
|
745
|
-
except Exception as e:
|
|
746
|
-
# Log the error but continue with manifest creation
|
|
747
|
-
print(f"Warning: Could not fetch model info for {repo_id}: {e}")
|
|
748
|
-
|
|
749
|
-
try:
|
|
741
|
+
pipeline_tag = info.pipeline_tag if hasattr(info, 'pipeline_tag') else None
|
|
742
|
+
|
|
750
743
|
# Get avatar URL
|
|
751
744
|
avatar_url = get_avatar_url_for_repo(repo_id, custom_endpoint=self.endpoint)
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
try:
|
|
767
|
-
minimal_manifest = {
|
|
768
|
-
"Name": repo_id,
|
|
769
|
-
"ModelType": "other",
|
|
770
|
-
"PluginId": "unknown",
|
|
771
|
-
"ModelFile": {},
|
|
772
|
-
"MMProjFile": {"Name": "", "Downloaded": False, "Size": 0},
|
|
773
|
-
"TokenizerFile": {"Name": "", "Downloaded": False, "Size": 0},
|
|
774
|
-
"ExtraFiles": None,
|
|
775
|
-
"pipeline_tag": old_metadata.get('pipeline_tag'),
|
|
776
|
-
"download_time": old_metadata.get('download_time'),
|
|
777
|
-
"avatar_url": old_metadata.get('avatar_url')
|
|
778
|
-
}
|
|
779
|
-
save_download_metadata(local_dir, minimal_manifest)
|
|
780
|
-
print(f"[OK] Created minimal nexa.manifest for {repo_id} as fallback")
|
|
781
|
-
except Exception as fallback_error:
|
|
782
|
-
print(f"CRITICAL ERROR: Could not create even minimal manifest for {repo_id}: {fallback_error}")
|
|
745
|
+
|
|
746
|
+
# Prepare metadata
|
|
747
|
+
metadata = {
|
|
748
|
+
'pipeline_tag': pipeline_tag,
|
|
749
|
+
'download_time': datetime.now().isoformat(),
|
|
750
|
+
'avatar_url': avatar_url
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
# Save metadata to the repository directory
|
|
754
|
+
_save_download_metadata(local_dir, metadata)
|
|
755
|
+
|
|
756
|
+
except Exception:
|
|
757
|
+
# Don't fail the download if metadata fetch fails
|
|
758
|
+
pass
|
|
783
759
|
|
|
784
760
|
def _download_single_file(
|
|
785
761
|
self,
|
|
@@ -796,7 +772,7 @@ class HuggingFaceDownloader:
|
|
|
796
772
|
# Check if file already exists
|
|
797
773
|
local_file_path = os.path.join(file_local_dir, file_name)
|
|
798
774
|
if not force_download and self._check_file_exists_and_valid(local_file_path):
|
|
799
|
-
print(f"
|
|
775
|
+
print(f"✓ File already exists, skipping: {file_name}")
|
|
800
776
|
# Stop progress tracking
|
|
801
777
|
if progress_tracker:
|
|
802
778
|
progress_tracker.stop_tracking()
|
|
@@ -844,6 +820,14 @@ class HuggingFaceDownloader:
|
|
|
844
820
|
# Create a subdirectory for this specific repo
|
|
845
821
|
repo_local_dir = self._create_repo_directory(local_dir, repo_id)
|
|
846
822
|
|
|
823
|
+
# Check if repository already exists (basic check for directory existence)
|
|
824
|
+
if not force_download and os.path.exists(repo_local_dir) and os.listdir(repo_local_dir):
|
|
825
|
+
print(f"✓ Repository already exists, skipping: {repo_id}")
|
|
826
|
+
# Stop progress tracking
|
|
827
|
+
if progress_tracker:
|
|
828
|
+
progress_tracker.stop_tracking()
|
|
829
|
+
return repo_local_dir
|
|
830
|
+
|
|
847
831
|
try:
|
|
848
832
|
download_kwargs = {
|
|
849
833
|
'repo_id': repo_id,
|
|
@@ -903,7 +887,7 @@ class HuggingFaceDownloader:
|
|
|
903
887
|
# Check if file already exists
|
|
904
888
|
local_file_path = os.path.join(repo_local_dir, file_name)
|
|
905
889
|
if not force_download and self._check_file_exists_and_valid(local_file_path):
|
|
906
|
-
print(f"
|
|
890
|
+
print(f"✓ File already exists, skipping: {file_name}")
|
|
907
891
|
overall_progress.update(1)
|
|
908
892
|
continue
|
|
909
893
|
|
nexaai/utils/progress_tracker.py
CHANGED
|
@@ -107,7 +107,7 @@ class DownloadProgressTracker:
|
|
|
107
107
|
time_diff = current_time - self.last_time
|
|
108
108
|
|
|
109
109
|
# Only calculate if we have a meaningful time difference (avoid division by very small numbers)
|
|
110
|
-
if time_diff > 0.
|
|
110
|
+
if time_diff > 0.5: # At least 500ms between measurements
|
|
111
111
|
bytes_diff = current_downloaded - self.last_downloaded
|
|
112
112
|
|
|
113
113
|
# Only calculate speed if bytes actually changed
|
|
@@ -118,14 +118,6 @@ class DownloadProgressTracker:
|
|
|
118
118
|
self.speed_history.append(speed)
|
|
119
119
|
if len(self.speed_history) > self.max_speed_history:
|
|
120
120
|
self.speed_history.pop(0)
|
|
121
|
-
|
|
122
|
-
# Update tracking variables when we actually calculate speed
|
|
123
|
-
self.last_downloaded = current_downloaded
|
|
124
|
-
self.last_time = current_time
|
|
125
|
-
else:
|
|
126
|
-
# First measurement - initialize tracking variables
|
|
127
|
-
self.last_downloaded = current_downloaded
|
|
128
|
-
self.last_time = current_time
|
|
129
121
|
|
|
130
122
|
# Return the average of historical speeds if we have any
|
|
131
123
|
# This ensures we show the last known speed even when skipping updates
|
|
@@ -165,9 +157,13 @@ class DownloadProgressTracker:
|
|
|
165
157
|
total_file_sizes += data['total']
|
|
166
158
|
active_file_count += 1
|
|
167
159
|
|
|
168
|
-
# Calculate speed
|
|
160
|
+
# Calculate speed
|
|
169
161
|
speed = self.calculate_speed(total_downloaded)
|
|
170
162
|
|
|
163
|
+
# Update tracking variables
|
|
164
|
+
self.last_downloaded = total_downloaded
|
|
165
|
+
self.last_time = time.time()
|
|
166
|
+
|
|
171
167
|
# Determine total size - prioritize pre-fetched repo size, then aggregate file sizes
|
|
172
168
|
if self.total_repo_size > 0:
|
|
173
169
|
# Use pre-fetched repository info if available
|
|
@@ -249,11 +245,11 @@ class DownloadProgressTracker:
|
|
|
249
245
|
if known_total and total_size_raw > 0:
|
|
250
246
|
# Known total size - show actual progress
|
|
251
247
|
filled_width = int(bar_width * min(percentage, 100) / 100)
|
|
252
|
-
bar = '
|
|
248
|
+
bar = '█' * filled_width + '░' * (bar_width - filled_width)
|
|
253
249
|
else:
|
|
254
250
|
# Unknown total size - show animated progress
|
|
255
251
|
animation_pos = int(time.time() * 2) % bar_width
|
|
256
|
-
bar = '
|
|
252
|
+
bar = '░' * animation_pos + '█' + '░' * (bar_width - animation_pos - 1)
|
|
257
253
|
|
|
258
254
|
# Format the progress line
|
|
259
255
|
status = progress_data.get('status', 'unknown')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nexaai
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.11rc1
|
|
4
4
|
Summary: Python bindings for NexaSDK C-lib backend
|
|
5
5
|
Author-email: "Nexa AI, Inc." <dev@nexa.ai>
|
|
6
6
|
Project-URL: Homepage, https://github.com/NexaAI/nexasdk-bridge
|
|
@@ -21,7 +21,6 @@ Provides-Extra: mlx
|
|
|
21
21
|
Requires-Dist: mlx; extra == "mlx"
|
|
22
22
|
Requires-Dist: mlx-lm; extra == "mlx"
|
|
23
23
|
Requires-Dist: mlx-vlm; extra == "mlx"
|
|
24
|
-
Requires-Dist: mlx-embeddings; extra == "mlx"
|
|
25
24
|
Requires-Dist: tokenizers; extra == "mlx"
|
|
26
25
|
Requires-Dist: safetensors; extra == "mlx"
|
|
27
26
|
Requires-Dist: Pillow; extra == "mlx"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
nexaai/__init__.py,sha256=jXdC4vv6DBK1fVewYTYSUhOOYfvf_Mk81UIeMGGIKUg,2029
|
|
2
|
-
nexaai/_stub.cpython-310-darwin.so,sha256=
|
|
3
|
-
nexaai/_version.py,sha256=
|
|
2
|
+
nexaai/_stub.cpython-310-darwin.so,sha256=acYZp3r-Ddh5bW5WOEBCcLFAlWdF0RvW-MS94Rbl600,66768
|
|
3
|
+
nexaai/_version.py,sha256=aLmvmIpwGMpBNLp3FVxB0MRLz-huXTnW2Nu2kwRjSss,143
|
|
4
4
|
nexaai/asr.py,sha256=NljMXDErwPNMOPaRkJZMEDka9Nk8xyur7L8i924TStY,2054
|
|
5
5
|
nexaai/base.py,sha256=N8PRgDFA-XPku2vWnQIofQ7ipz3pPlO6f8YZGnuhquE,982
|
|
6
6
|
nexaai/common.py,sha256=yBnIbqYaQYnfrl7IczOBh6MDibYZVxwaRJEglYcKgGs,3422
|
|
@@ -16,20 +16,20 @@ nexaai/asr_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
16
16
|
nexaai/asr_impl/mlx_asr_impl.py,sha256=eosd8-TIWAOwV0HltmoFrLwzXHcU4jyxtncvuZE9pgA,3257
|
|
17
17
|
nexaai/asr_impl/pybind_asr_impl.py,sha256=pE9Hb_hMi5yAc4MF83bLVOb8zDtreCkB3_u7XED9YpA,1516
|
|
18
18
|
nexaai/binds/__init__.py,sha256=T9Ua7SzHNglSeEqXlfH5ymYXRyXhNKkC9z_y_bWCNMo,80
|
|
19
|
-
nexaai/binds/common_bind.cpython-310-darwin.so,sha256=
|
|
20
|
-
nexaai/binds/embedder_bind.cpython-310-darwin.so,sha256=
|
|
19
|
+
nexaai/binds/common_bind.cpython-310-darwin.so,sha256=nkZyv_jnzSWaLxb2pVlVR4baM2SM9pCLPVLyjKaRfeA,217232
|
|
20
|
+
nexaai/binds/embedder_bind.cpython-310-darwin.so,sha256=AKEzYSA5iaKz6thkpfjiSq8s8GtjjzqWNd0kxgkLY8A,202064
|
|
21
21
|
nexaai/binds/libcrypto.dylib,sha256=aWif9WhTKVQhmZL3DmtIpMkZY5JSb_Ny6CClmUBKYM4,4710416
|
|
22
|
-
nexaai/binds/libnexa_bridge.dylib,sha256=
|
|
22
|
+
nexaai/binds/libnexa_bridge.dylib,sha256=Y5vLCvHn038UV6G_frDLjqPb93T8yI41Hz9z5Ik9WxY,251080
|
|
23
23
|
nexaai/binds/libssl.dylib,sha256=Q2frAdhR729oKYuCjJOEr1Ott3idFWoFp98fwNqtIaU,881616
|
|
24
|
-
nexaai/binds/llm_bind.cpython-310-darwin.so,sha256=
|
|
25
|
-
nexaai/binds/nexa_llama_cpp/libggml-base.dylib,sha256=
|
|
26
|
-
nexaai/binds/nexa_llama_cpp/libggml-cpu.so,sha256=
|
|
27
|
-
nexaai/binds/nexa_llama_cpp/libggml-metal.so,sha256=
|
|
28
|
-
nexaai/binds/nexa_llama_cpp/libggml.dylib,sha256=
|
|
29
|
-
nexaai/binds/nexa_llama_cpp/libllama.dylib,sha256=
|
|
30
|
-
nexaai/binds/nexa_llama_cpp/libmtmd.dylib,sha256=
|
|
31
|
-
nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib,sha256=
|
|
32
|
-
nexaai/binds/nexa_mlx/libnexa_plugin.dylib,sha256=
|
|
24
|
+
nexaai/binds/llm_bind.cpython-310-darwin.so,sha256=8ONMAgigH_zgrvFwNi-OUeIFZD4kWyLflntD54gbUa8,182704
|
|
25
|
+
nexaai/binds/nexa_llama_cpp/libggml-base.dylib,sha256=CzsTec_QHlvbBGzmx4MBQ4LUjG7aIqW1rP5p_A90Vds,632048
|
|
26
|
+
nexaai/binds/nexa_llama_cpp/libggml-cpu.so,sha256=RiMhOv6IAWY1zkFTp0JCB7CYoPfOv54vBVQHvj1koBM,661120
|
|
27
|
+
nexaai/binds/nexa_llama_cpp/libggml-metal.so,sha256=L4RQvaD0w4qBjexi4O05RMCH8842fof5QgBEvyx0RcA,673104
|
|
28
|
+
nexaai/binds/nexa_llama_cpp/libggml.dylib,sha256=aOTj_6RrAMkfDO0ZI28_3nfcC-l4Y3dRCiS3C0d0_eI,58592
|
|
29
|
+
nexaai/binds/nexa_llama_cpp/libllama.dylib,sha256=fDPnTG6EQ1JN6aRmnIFQzag_kmtyImRxKjMOOtaTY5Q,1746928
|
|
30
|
+
nexaai/binds/nexa_llama_cpp/libmtmd.dylib,sha256=ccnBRsJNFGTCsjgW03N9PvX26wUirqpxljnxdVPINVc,587008
|
|
31
|
+
nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib,sha256=e4DsGxsiTdK4Xs2txMfeEUc2SmJW_RAk-VU4tHLDqEA,2368632
|
|
32
|
+
nexaai/binds/nexa_mlx/libnexa_plugin.dylib,sha256=x4bEANRoVb1pyFEcUDMVwKEvqPERCJMc8FWZkH2Emfc,1422824
|
|
33
33
|
nexaai/binds/nexa_mlx/py-lib/ml.py,sha256=LafDM_TeXmuQkld2tdQxUBGgooT0JPMXngLam2TADqU,23179
|
|
34
34
|
nexaai/binds/nexa_mlx/py-lib/profiling.py,sha256=Dc-mybFwBdCIKFWL7CbSHjkOJGAoYHG7r_e_XPhzwBU,9361
|
|
35
35
|
nexaai/binds/nexa_mlx/py-lib/mlx_audio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -186,7 +186,7 @@ nexaai/cv_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
186
186
|
nexaai/cv_impl/mlx_cv_impl.py,sha256=gKECQOv8iaWwG3bl7xeqVy2NN_9K7tYerIFzfn4eLo4,3228
|
|
187
187
|
nexaai/cv_impl/pybind_cv_impl.py,sha256=uSmwBste4cT7c8DQmXzRLmzwDf773PAbXNYWW1UzVls,1064
|
|
188
188
|
nexaai/embedder_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
189
|
-
nexaai/embedder_impl/mlx_embedder_impl.py,sha256=
|
|
189
|
+
nexaai/embedder_impl/mlx_embedder_impl.py,sha256=OsDzsc_2wZkSoWu6yCOZadMkaYdBW3uyjF11hDKTaX8,4383
|
|
190
190
|
nexaai/embedder_impl/pybind_embedder_impl.py,sha256=Ga1JYauVkRq6jwAGL7Xx5HDaIx483_v9gZVoTyd3xNU,3495
|
|
191
191
|
nexaai/image_gen_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
192
192
|
nexaai/image_gen_impl/mlx_image_gen_impl.py,sha256=BuDkksvXyb4J02GsdnbGAmYckfUU0Eah6BimoMD3QqY,11219
|
|
@@ -206,9 +206,9 @@ nexaai/mlx_backend/cv/interface.py,sha256=qE51ApUETEZxDMPZB4VdV098fsXcIiEg4Hj9za
|
|
|
206
206
|
nexaai/mlx_backend/cv/main.py,sha256=hYaF2C36hKTyy7kGMNkzLrdczPiFVS73H320klzzpVM,2856
|
|
207
207
|
nexaai/mlx_backend/cv/modeling/pp_ocr_v4.py,sha256=Vpa-QTy7N5oFfGI7Emldx1dOYJWv_4nAFNRDz_5vHBI,58593
|
|
208
208
|
nexaai/mlx_backend/embedding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
209
|
-
nexaai/mlx_backend/embedding/generate.py,sha256=
|
|
210
|
-
nexaai/mlx_backend/embedding/interface.py,sha256=
|
|
211
|
-
nexaai/mlx_backend/embedding/main.py,sha256=
|
|
209
|
+
nexaai/mlx_backend/embedding/generate.py,sha256=irAbc_nBD9wMqe5z1eFgp6Gf_mONow2I3z3g-DAAbtY,5018
|
|
210
|
+
nexaai/mlx_backend/embedding/interface.py,sha256=hW0yrtD55ol0hB-X5glcXMc4TiyKuT4U5GaI8SP-kAU,11508
|
|
211
|
+
nexaai/mlx_backend/embedding/main.py,sha256=_kIwz69A7UXA_u0VNP6eqM2W-LH_1_1hlJtro6U_FjI,2620
|
|
212
212
|
nexaai/mlx_backend/embedding/modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
213
213
|
nexaai/mlx_backend/embedding/modeling/nexa_jina_v2.py,sha256=F9Z_9r-Dh0wNThiMp5W5hqE2dt5bf4ps5_c6h4BuWGw,15218
|
|
214
214
|
nexaai/mlx_backend/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -511,15 +511,12 @@ nexaai/tts_impl/mlx_tts_impl.py,sha256=i_uNPdvlXYtL3e01oKjDlP9jgkWCRt1bBHsExaaiJ
|
|
|
511
511
|
nexaai/tts_impl/pybind_tts_impl.py,sha256=mpn44r6pfYLIl-NrEy2dXHjGtWtNCmM7HRyxiANxUI4,1444
|
|
512
512
|
nexaai/utils/avatar_fetcher.py,sha256=bWy8ujgbOiTHFCjFxTwkn3uXbZ84PgEGUkXkR3MH4bI,3821
|
|
513
513
|
nexaai/utils/decode.py,sha256=61n4Zf6c5QLyqGoctEitlI9BX3tPlP2a5aaKNHbw3T4,404
|
|
514
|
-
nexaai/utils/
|
|
515
|
-
nexaai/utils/
|
|
516
|
-
nexaai/utils/model_types.py,sha256=-DER8L4lAUR_iLS99F0r57avwqWtuN21ug5pX2p24_E,1369
|
|
517
|
-
nexaai/utils/progress_tracker.py,sha256=jdUqtmPqyhwC9uSKvQcJEYETwSt-OhP4oitdJ94614o,15394
|
|
518
|
-
nexaai/utils/quantization_utils.py,sha256=4gvp6UQfSO9G1FYBwnFtQspTzH9sDbi1PBXw2t1N69M,7650
|
|
514
|
+
nexaai/utils/model_manager.py,sha256=c07ocxxw1IHCQw6esbmYK0dX2R2OajfEIGsC_2teHXo,48572
|
|
515
|
+
nexaai/utils/progress_tracker.py,sha256=76HlPkyN41IMHSsH56-qdlN_aY_oBfJz50J16Cx67R0,15102
|
|
519
516
|
nexaai/vlm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
520
517
|
nexaai/vlm_impl/mlx_vlm_impl.py,sha256=od1R1mRoIgPG3NHC7JiDlcB_YJY8aklX8Em3ZkeHNpE,10734
|
|
521
518
|
nexaai/vlm_impl/pybind_vlm_impl.py,sha256=5ZMFgDATthmMzjrd-vE5KX5ZAMoWPYbF_FTLz8DBKIk,8908
|
|
522
|
-
nexaai-1.0.
|
|
523
|
-
nexaai-1.0.
|
|
524
|
-
nexaai-1.0.
|
|
525
|
-
nexaai-1.0.
|
|
519
|
+
nexaai-1.0.11rc1.dist-info/METADATA,sha256=1UI_ZmsEDJFn8NcMw7nhR7KXVn7FQMv4XaCW9mH0B78,1155
|
|
520
|
+
nexaai-1.0.11rc1.dist-info/WHEEL,sha256=T2p57lol9__xkoU6aJTyN1Pm43ZpRU3q6km7mIbrAMs,114
|
|
521
|
+
nexaai-1.0.11rc1.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
|
|
522
|
+
nexaai-1.0.11rc1.dist-info/RECORD,,
|