nexaai 1.0.10__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.

@@ -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
- # Only include if nexa.manifest or download_metadata.json exists (backward compatibility)
154
- if _has_valid_metadata(subitem_path):
155
- size_bytes, files = _get_directory_size_and_files(subitem_path)
156
- if files: # Only include if there are files
157
- # Check if the download is complete
158
- download_complete = _check_for_incomplete_downloads(subitem_path)
159
- # Load metadata if it exists
160
- repo_id = f"{item}/{subitem}"
161
- metadata = load_download_metadata(subitem_path, repo_id)
162
- models.append(DownloadedModel(
163
- repo_id=repo_id,
164
- files=files,
165
- folder_type='owner_repo',
166
- local_path=subitem_path,
167
- size_bytes=size_bytes,
168
- file_count=len(files),
169
- full_repo_download_complete=download_complete,
170
- pipeline_tag=metadata.get('pipeline_tag'),
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
- # Only include if nexa.manifest or download_metadata.json exists (backward compatibility)
183
- if _has_valid_metadata(item_path):
184
- size_bytes, files = _get_directory_size_and_files(item_path)
185
- if files: # Only include if there are files
186
- # Check if the download is complete
187
- download_complete = _check_for_incomplete_downloads(item_path)
188
- # Load metadata if it exists
189
- repo_id = item
190
- metadata = load_download_metadata(item_path, repo_id)
191
- models.append(DownloadedModel(
192
- repo_id=repo_id,
193
- files=files,
194
- folder_type='direct_repo',
195
- local_path=item_path,
196
- size_bytes=size_bytes,
197
- file_count=len(files),
198
- full_repo_download_complete=download_complete,
199
- pipeline_tag=metadata.get('pipeline_tag'),
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
- old_metadata['pipeline_tag'] = info.pipeline_tag
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
- if avatar_url:
753
- old_metadata['avatar_url'] = avatar_url
754
- except Exception as e:
755
- # Log the error but continue with manifest creation
756
- print(f"Warning: Could not fetch avatar URL for {repo_id}: {e}")
757
-
758
- # CRITICAL: Always create the manifest file, regardless of metadata fetch failures
759
- try:
760
- save_manifest_with_files_metadata(repo_id, local_dir, old_metadata)
761
- print(f"[OK] Successfully created nexa.manifest for {repo_id}")
762
- except Exception as e:
763
- # This is critical - if manifest creation fails, we should know about it
764
- print(f"ERROR: Failed to create nexa.manifest for {repo_id}: {e}")
765
- # Try a fallback approach - create a minimal manifest
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"[SKIP] File already exists: {file_name}")
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"[SKIP] File already exists: {file_name}")
890
+ print(f" File already exists, skipping: {file_name}")
907
891
  overall_progress.update(1)
908
892
  continue
909
893
 
@@ -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.1: # At least 100ms between measurements
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 (tracking variables are updated internally)
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 = '#' * filled_width + '-' * (bar_width - filled_width)
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 = '-' * animation_pos + '#' + '-' * (bar_width - animation_pos - 1)
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.10
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=FlOqZRvfJr-nP91tGW6SYVvKCLgPf97u50oFFQcriRo,66768
3
- nexaai/_version.py,sha256=EQNxHksifOH_AULLtWe9YcAspUa2i5pDUOE1X_2WhDs,139
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=hVxY76tn7hN6uHDIgM7LWNvgoudHgNZVoaygM9X1RWE,217232
20
- nexaai/binds/embedder_bind.cpython-310-darwin.so,sha256=FT8581RNciilskK89PhtnNSjw4Oh0-xk8QdbJVFmOd8,202064
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=1Y2RCHC1DZ2HQsBEX9lf6GPwEJYdmnIt8kiHISuLf8E,251480
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=3Bsq0_tGkM027-bORVeJUDl6CYZxAF9sbDIn1l31XTQ,182704
25
- nexaai/binds/nexa_llama_cpp/libggml-base.dylib,sha256=JM4oOkie1su0ES5hMdtILeQHlRukRzH1vTleTupUXhg,650736
26
- nexaai/binds/nexa_llama_cpp/libggml-cpu.so,sha256=qiYxbTe4Nt7n36zJVvq3zovgSZEmrN2is6gzTern7UI,677728
27
- nexaai/binds/nexa_llama_cpp/libggml-metal.so,sha256=zfaX7rIBYQazH2lf-vza007BMhPTK1ASd2T0HLLIA4E,673104
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
28
  nexaai/binds/nexa_llama_cpp/libggml.dylib,sha256=aOTj_6RrAMkfDO0ZI28_3nfcC-l4Y3dRCiS3C0d0_eI,58592
29
- nexaai/binds/nexa_llama_cpp/libllama.dylib,sha256=RkBd5usb8RvEIOamvxCW3UvMauI5bC66G_n6hw83NpY,1786128
30
- nexaai/binds/nexa_llama_cpp/libmtmd.dylib,sha256=o6mQqefzQNF0CS4j6odwJKj0gkXm15hIxwlNt88FOn4,605248
31
- nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib,sha256=8YVSN-7p64t6o5UEmeAxHQIWX-aPlYzT00o0dqYBlmQ,2422808
32
- nexaai/binds/nexa_mlx/libnexa_plugin.dylib,sha256=yjbdy0FpBE_RwgqvwGxd3czIfs3OYVoh--vWpn2H7RQ,1422888
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=dTjOC1VJ9ypIgCvkK_jKNSWpswbg132rDcTzWcL5oFA,4482
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=leZA0Ir78-5GV3jloPKYSAKgb04Wr5jORFJlSSVyKs0,12855
210
- nexaai/mlx_backend/embedding/interface.py,sha256=M7AGiq_UVLNIi2Ie6H08ySnMxIjIhUlNgmV9I_rKYt4,22742
211
- nexaai/mlx_backend/embedding/main.py,sha256=xKRebBcooKuf8DzWKwCicftes3MAcYAd1QvcT9_AAPQ,6003
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/manifest_utils.py,sha256=2waOuQErodNHhoAETQqlQgXdVes-T5A4HMb8pUIN9hg,9765
515
- nexaai/utils/model_manager.py,sha256=wngqu5uISyoXlytJXgDldBLMnNyFWbun5g17TqyiLkA,50247
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.10.dist-info/METADATA,sha256=PxpKk8abTZbSfmnSMJZOnbEdBTsz6rUd7So3hwJwlG8,1198
523
- nexaai-1.0.10.dist-info/WHEEL,sha256=T2p57lol9__xkoU6aJTyN1Pm43ZpRU3q6km7mIbrAMs,114
524
- nexaai-1.0.10.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
525
- nexaai-1.0.10.dist-info/RECORD,,
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,,