nexaai 1.0.20__cp310-cp310-win_amd64.whl → 1.0.21__cp310-cp310-win_amd64.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/__init__.py +12 -0
- nexaai/_stub.cp310-win_amd64.pyd +0 -0
- nexaai/_version.py +1 -1
- nexaai/asr.py +10 -6
- nexaai/asr_impl/pybind_asr_impl.py +98 -15
- nexaai/binds/__init__.py +2 -0
- nexaai/binds/asr_bind.cp310-win_amd64.pyd +0 -0
- nexaai/binds/common_bind.cp310-win_amd64.pyd +0 -0
- nexaai/binds/cpu_gpu/ggml-base.dll +0 -0
- nexaai/binds/cpu_gpu/ggml-cpu.dll +0 -0
- nexaai/binds/cpu_gpu/ggml-cuda.dll +0 -0
- nexaai/binds/cpu_gpu/ggml-vulkan.dll +0 -0
- nexaai/binds/cpu_gpu/ggml.dll +0 -0
- nexaai/binds/cpu_gpu/mtmd.dll +0 -0
- nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll +0 -0
- nexaai/binds/cpu_gpu/nexa_plugin.dll +0 -0
- nexaai/binds/embedder_bind.cp310-win_amd64.pyd +0 -0
- nexaai/binds/llm_bind.cp310-win_amd64.pyd +0 -0
- nexaai/binds/nexa_bridge.dll +0 -0
- nexaai/binds/nexaml/ggml-base.dll +0 -0
- nexaai/binds/nexaml/ggml-cpu.dll +0 -0
- nexaai/binds/nexaml/ggml-cuda.dll +0 -0
- nexaai/binds/nexaml/ggml-vulkan.dll +0 -0
- nexaai/binds/nexaml/ggml.dll +0 -0
- nexaai/binds/nexaml/nexa_plugin.dll +0 -0
- nexaai/binds/nexaml/nexaproc.dll +0 -0
- nexaai/binds/nexaml/qwen3-vl.dll +0 -0
- nexaai/binds/rerank_bind.cp310-win_amd64.pyd +0 -0
- nexaai/binds/vlm_bind.cp310-win_amd64.pyd +0 -0
- nexaai/common.py +1 -0
- nexaai/cv.py +2 -1
- nexaai/embedder.py +4 -3
- nexaai/embedder_impl/mlx_embedder_impl.py +3 -1
- nexaai/embedder_impl/pybind_embedder_impl.py +3 -2
- nexaai/image_gen.py +2 -1
- nexaai/llm.py +5 -3
- nexaai/llm_impl/mlx_llm_impl.py +2 -0
- nexaai/llm_impl/pybind_llm_impl.py +2 -0
- nexaai/rerank.py +5 -3
- nexaai/rerank_impl/mlx_rerank_impl.py +2 -0
- nexaai/rerank_impl/pybind_rerank_impl.py +109 -16
- nexaai/runtime_error.py +24 -0
- nexaai/tts.py +2 -1
- nexaai/utils/manifest_utils.py +10 -6
- nexaai/utils/model_manager.py +139 -8
- nexaai/vlm.py +4 -2
- nexaai/vlm_impl/mlx_vlm_impl.py +3 -2
- nexaai/vlm_impl/pybind_vlm_impl.py +33 -7
- {nexaai-1.0.20.dist-info → nexaai-1.0.21.dist-info}/METADATA +1 -2
- nexaai-1.0.21.dist-info/RECORD +79 -0
- nexaai-1.0.20.dist-info/RECORD +0 -76
- {nexaai-1.0.20.dist-info → nexaai-1.0.21.dist-info}/WHEEL +0 -0
- {nexaai-1.0.20.dist-info → nexaai-1.0.21.dist-info}/top_level.txt +0 -0
nexaai/runtime_error.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Runtime errors for Nexa SDK operations."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class NexaRuntimeError(Exception):
|
|
5
|
+
"""Base class for Nexa runtime errors."""
|
|
6
|
+
|
|
7
|
+
def __init__(self, message: str, error_code: int = None):
|
|
8
|
+
self.error_code = error_code
|
|
9
|
+
super().__init__(message)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ContextLengthExceededError(NexaRuntimeError):
|
|
13
|
+
"""Raised when the input context length exceeds the model's maximum."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, message: str = "Input context length exceeded model's maximum", error_code: int = None):
|
|
16
|
+
super().__init__(message, error_code)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class GenerationError(NexaRuntimeError):
|
|
20
|
+
"""Raised when generation fails."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, message: str = "Generation failed", error_code: int = None):
|
|
23
|
+
super().__init__(message, error_code)
|
|
24
|
+
|
nexaai/tts.py
CHANGED
|
@@ -45,7 +45,8 @@ class TTS(BaseModel):
|
|
|
45
45
|
model_path: str,
|
|
46
46
|
vocoder_path: str,
|
|
47
47
|
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
48
|
-
device_id: Optional[str] = None
|
|
48
|
+
device_id: Optional[str] = None,
|
|
49
|
+
**kwargs
|
|
49
50
|
) -> 'TTS':
|
|
50
51
|
"""Load TTS model from local path, routing to appropriate implementation."""
|
|
51
52
|
# Check plugin_id value for routing - handle both enum and string
|
nexaai/utils/manifest_utils.py
CHANGED
|
@@ -157,12 +157,16 @@ def create_gguf_manifest(repo_id: str, files: List[str], directory_path: str, ol
|
|
|
157
157
|
# Use the new enum-based quantization extraction
|
|
158
158
|
quantization_type = extract_quantization_from_filename(current_file_name)
|
|
159
159
|
quant_level = quantization_type.value if quantization_type else "UNKNOWN"
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
160
|
+
|
|
161
|
+
# FIXME: hardcode to handle the multiple mmproj files problem
|
|
162
|
+
if quant_level == "UNKNOWN" and "mmproj" in current_file_name.lower():
|
|
163
|
+
pass
|
|
164
|
+
else:
|
|
165
|
+
model_files[quant_level] = {
|
|
166
|
+
"Name": current_file_name,
|
|
167
|
+
"Downloaded": True,
|
|
168
|
+
"Size": file_size
|
|
169
|
+
}
|
|
166
170
|
|
|
167
171
|
# Determine PluginId with priority: kwargs > downloaded_manifest > model_file_type > default
|
|
168
172
|
plugin_id = kwargs.get('plugin_id')
|
nexaai/utils/model_manager.py
CHANGED
|
@@ -410,6 +410,20 @@ def _remove_specific_file(target_model: DownloadedModel, file_name: str, local_d
|
|
|
410
410
|
except OSError:
|
|
411
411
|
file_size = 0
|
|
412
412
|
|
|
413
|
+
# Check if we should remove entire folder instead (for .gguf files)
|
|
414
|
+
# If removing a .gguf file and no other non-mmproj .gguf files remain, remove entire folder
|
|
415
|
+
if file_name.endswith('.gguf'):
|
|
416
|
+
updated_files = [f for f in target_model.files if f != file_name]
|
|
417
|
+
# Find remaining .gguf files that don't contain "mmproj" in filename
|
|
418
|
+
remaining_non_mmproj_gguf = [
|
|
419
|
+
f for f in updated_files
|
|
420
|
+
if f.endswith('.gguf') and 'mmproj' not in f.lower()
|
|
421
|
+
]
|
|
422
|
+
|
|
423
|
+
# If no non-mmproj .gguf files remain, remove entire repository
|
|
424
|
+
if len(remaining_non_mmproj_gguf) == 0:
|
|
425
|
+
return _remove_entire_repository(target_model, local_dir)
|
|
426
|
+
|
|
413
427
|
# Remove the file
|
|
414
428
|
try:
|
|
415
429
|
os.remove(file_path)
|
|
@@ -846,6 +860,41 @@ class HuggingFaceDownloader:
|
|
|
846
860
|
pass
|
|
847
861
|
return {}
|
|
848
862
|
|
|
863
|
+
def _download_manifest_if_needed(self, repo_id: str, local_dir: str) -> bool:
|
|
864
|
+
"""
|
|
865
|
+
Download nexa.manifest from the repository if it doesn't exist locally.
|
|
866
|
+
|
|
867
|
+
Args:
|
|
868
|
+
repo_id: Repository ID
|
|
869
|
+
local_dir: Local directory where the manifest should be saved
|
|
870
|
+
|
|
871
|
+
Returns:
|
|
872
|
+
bool: True if manifest was downloaded or already exists, False if not found in repo
|
|
873
|
+
"""
|
|
874
|
+
manifest_path = os.path.join(local_dir, 'nexa.manifest')
|
|
875
|
+
|
|
876
|
+
# Check if manifest already exists locally
|
|
877
|
+
if os.path.exists(manifest_path):
|
|
878
|
+
return True
|
|
879
|
+
|
|
880
|
+
# Try to download nexa.manifest from the repository
|
|
881
|
+
try:
|
|
882
|
+
print(f"[INFO] Attempting to download nexa.manifest from {repo_id}...")
|
|
883
|
+
self.api.hf_hub_download(
|
|
884
|
+
repo_id=repo_id,
|
|
885
|
+
filename='nexa.manifest',
|
|
886
|
+
local_dir=local_dir,
|
|
887
|
+
local_dir_use_symlinks=False,
|
|
888
|
+
token=self.token,
|
|
889
|
+
force_download=False
|
|
890
|
+
)
|
|
891
|
+
print(f"[OK] Successfully downloaded nexa.manifest from {repo_id}")
|
|
892
|
+
return True
|
|
893
|
+
except Exception as e:
|
|
894
|
+
# Manifest doesn't exist in repo or other error - this is fine, we'll create it
|
|
895
|
+
print(f"[INFO] nexa.manifest not found in {repo_id}, will create locally")
|
|
896
|
+
return False
|
|
897
|
+
|
|
849
898
|
def _fetch_and_save_metadata(self, repo_id: str, local_dir: str, is_mmproj: bool = False, file_name: Optional[Union[str, List[str]]] = None, **kwargs) -> None:
|
|
850
899
|
"""Fetch model info and save metadata after successful download."""
|
|
851
900
|
# Initialize metadata with defaults to ensure manifest is always created
|
|
@@ -946,6 +995,9 @@ class HuggingFaceDownloader:
|
|
|
946
995
|
if progress_tracker:
|
|
947
996
|
progress_tracker.stop_tracking()
|
|
948
997
|
|
|
998
|
+
# Download nexa.manifest from repo if it doesn't exist locally
|
|
999
|
+
self._download_manifest_if_needed(repo_id, file_local_dir)
|
|
1000
|
+
|
|
949
1001
|
# Save metadata after successful download
|
|
950
1002
|
self._fetch_and_save_metadata(repo_id, file_local_dir, self._current_is_mmproj, self._current_file_name, **kwargs)
|
|
951
1003
|
|
|
@@ -1055,6 +1107,9 @@ class HuggingFaceDownloader:
|
|
|
1055
1107
|
if progress_tracker:
|
|
1056
1108
|
progress_tracker.stop_tracking()
|
|
1057
1109
|
|
|
1110
|
+
# Download nexa.manifest from repo if it doesn't exist locally
|
|
1111
|
+
self._download_manifest_if_needed(repo_id, repo_local_dir)
|
|
1112
|
+
|
|
1058
1113
|
# Save metadata after successful download
|
|
1059
1114
|
self._fetch_and_save_metadata(repo_id, repo_local_dir, self._current_is_mmproj, self._current_file_name, **kwargs)
|
|
1060
1115
|
|
|
@@ -1289,7 +1344,7 @@ def _download_model_if_needed(
|
|
|
1289
1344
|
token: Union[bool, str, None] = None,
|
|
1290
1345
|
is_mmproj: bool = False,
|
|
1291
1346
|
**kwargs
|
|
1292
|
-
) -> str:
|
|
1347
|
+
) -> tuple[str, Optional[str], Optional[str]]:
|
|
1293
1348
|
"""
|
|
1294
1349
|
Helper function to download a model from HuggingFace if it doesn't exist locally.
|
|
1295
1350
|
|
|
@@ -1300,15 +1355,78 @@ def _download_model_if_needed(
|
|
|
1300
1355
|
token: HuggingFace authentication token for private repositories
|
|
1301
1356
|
|
|
1302
1357
|
Returns:
|
|
1303
|
-
str
|
|
1358
|
+
tuple[str, Optional[str], Optional[str]]: Tuple of (local_path, model_name, plugin_id)
|
|
1359
|
+
- local_path: Local path to the model (either existing or downloaded)
|
|
1360
|
+
- model_name: ModelName from nexa.manifest if available, None otherwise
|
|
1361
|
+
- plugin_id: PluginId from nexa.manifest if available, None otherwise
|
|
1304
1362
|
|
|
1305
1363
|
Raises:
|
|
1306
1364
|
RuntimeError: If download fails
|
|
1307
1365
|
"""
|
|
1366
|
+
# Helper function to extract model info from manifest
|
|
1367
|
+
def _extract_info_from_manifest(path: str) -> tuple[Optional[str], Optional[str], Optional[dict]]:
|
|
1368
|
+
"""Extract ModelName, PluginId, and full manifest from nexa.manifest if it exists."""
|
|
1369
|
+
# If path is a file, check its parent directory for manifest
|
|
1370
|
+
if os.path.isfile(path):
|
|
1371
|
+
manifest_dir = os.path.dirname(path)
|
|
1372
|
+
else:
|
|
1373
|
+
manifest_dir = path
|
|
1374
|
+
|
|
1375
|
+
manifest_path = os.path.join(manifest_dir, 'nexa.manifest')
|
|
1376
|
+
if not os.path.exists(manifest_path):
|
|
1377
|
+
return None, None, None
|
|
1378
|
+
|
|
1379
|
+
try:
|
|
1380
|
+
with open(manifest_path, 'r', encoding='utf-8') as f:
|
|
1381
|
+
manifest = json.load(f)
|
|
1382
|
+
return manifest.get('ModelName'), manifest.get('PluginId'), manifest
|
|
1383
|
+
except (json.JSONDecodeError, IOError):
|
|
1384
|
+
return None, None, None
|
|
1385
|
+
|
|
1386
|
+
# Helper function to get a model file path from manifest
|
|
1387
|
+
# Note: Tnis is for NPU only, because when downloading, it is a directory; when passing local path to inference, it needs to be a file.
|
|
1388
|
+
def _get_model_file_from_manifest(manifest: dict, base_dir: str) -> Optional[str]:
|
|
1389
|
+
"""Extract a model file path from manifest's ModelFile section."""
|
|
1390
|
+
if not manifest or 'ModelFile' not in manifest:
|
|
1391
|
+
return None
|
|
1392
|
+
|
|
1393
|
+
model_files = manifest['ModelFile']
|
|
1394
|
+
# Find the first valid model file (skip N/A entries and metadata files)
|
|
1395
|
+
for key, file_info in model_files.items():
|
|
1396
|
+
if key == 'N/A':
|
|
1397
|
+
continue
|
|
1398
|
+
if isinstance(file_info, dict) and 'Name' in file_info:
|
|
1399
|
+
file_name = file_info['Name']
|
|
1400
|
+
# Skip common non-model files
|
|
1401
|
+
if file_name and not file_name.startswith('.') and file_name.endswith('.nexa'):
|
|
1402
|
+
file_path = os.path.join(base_dir, file_name)
|
|
1403
|
+
if os.path.exists(file_path):
|
|
1404
|
+
return file_path
|
|
1405
|
+
|
|
1406
|
+
# If no .nexa files found, try ExtraFiles for .nexa files
|
|
1407
|
+
if 'ExtraFiles' in manifest:
|
|
1408
|
+
for file_info in manifest['ExtraFiles']:
|
|
1409
|
+
if isinstance(file_info, dict) and 'Name' in file_info:
|
|
1410
|
+
file_name = file_info['Name']
|
|
1411
|
+
if file_name and file_name.endswith('.nexa') and not file_name.startswith('.cache'):
|
|
1412
|
+
file_path = os.path.join(base_dir, file_name)
|
|
1413
|
+
if os.path.exists(file_path):
|
|
1414
|
+
return file_path
|
|
1415
|
+
|
|
1416
|
+
return None
|
|
1417
|
+
|
|
1308
1418
|
# Check if model_path exists locally (file or directory)
|
|
1309
1419
|
if os.path.exists(model_path):
|
|
1310
|
-
# Local path exists,
|
|
1311
|
-
|
|
1420
|
+
# Local path exists, try to extract model info
|
|
1421
|
+
model_name, plugin_id, manifest = _extract_info_from_manifest(model_path)
|
|
1422
|
+
|
|
1423
|
+
# If PluginId is "npu" and path is a directory, convert to file path
|
|
1424
|
+
if plugin_id == "npu" and os.path.isdir(model_path):
|
|
1425
|
+
model_file_path = _get_model_file_from_manifest(manifest, model_path)
|
|
1426
|
+
if model_file_path:
|
|
1427
|
+
model_path = model_file_path
|
|
1428
|
+
|
|
1429
|
+
return model_path, model_name, plugin_id
|
|
1312
1430
|
|
|
1313
1431
|
# Model path doesn't exist locally, try to download from HuggingFace
|
|
1314
1432
|
try:
|
|
@@ -1328,7 +1446,16 @@ def _download_model_if_needed(
|
|
|
1328
1446
|
**kwargs
|
|
1329
1447
|
)
|
|
1330
1448
|
|
|
1331
|
-
|
|
1449
|
+
# Extract model info from the downloaded manifest
|
|
1450
|
+
model_name, plugin_id, manifest = _extract_info_from_manifest(downloaded_path)
|
|
1451
|
+
|
|
1452
|
+
# If PluginId is "npu" and path is a directory, convert to file path
|
|
1453
|
+
if plugin_id == "npu" and os.path.isdir(downloaded_path):
|
|
1454
|
+
model_file_path = _get_model_file_from_manifest(manifest, downloaded_path)
|
|
1455
|
+
if model_file_path:
|
|
1456
|
+
downloaded_path = model_file_path
|
|
1457
|
+
|
|
1458
|
+
return downloaded_path, model_name, plugin_id
|
|
1332
1459
|
|
|
1333
1460
|
except Exception as e:
|
|
1334
1461
|
# Only handle download-related errors
|
|
@@ -1397,7 +1524,7 @@ def auto_download_model(func: Callable) -> Callable:
|
|
|
1397
1524
|
# Download name_or_path if needed
|
|
1398
1525
|
if name_or_path is not None:
|
|
1399
1526
|
try:
|
|
1400
|
-
downloaded_name_path = _download_model_if_needed(
|
|
1527
|
+
downloaded_name_path, model_name, plugin_id = _download_model_if_needed(
|
|
1401
1528
|
name_or_path, 'name_or_path', progress_callback, token, **kwargs
|
|
1402
1529
|
)
|
|
1403
1530
|
|
|
@@ -1408,6 +1535,10 @@ def auto_download_model(func: Callable) -> Callable:
|
|
|
1408
1535
|
args = tuple(args_list)
|
|
1409
1536
|
else:
|
|
1410
1537
|
kwargs['name_or_path'] = downloaded_name_path
|
|
1538
|
+
|
|
1539
|
+
# Add model_name to kwargs if it exists and not already set
|
|
1540
|
+
if model_name is not None and 'model_name' not in kwargs:
|
|
1541
|
+
kwargs['model_name'] = model_name
|
|
1411
1542
|
|
|
1412
1543
|
except Exception as e:
|
|
1413
1544
|
raise e # Re-raise the error from _download_model_if_needed
|
|
@@ -1415,7 +1546,7 @@ def auto_download_model(func: Callable) -> Callable:
|
|
|
1415
1546
|
# Download mmproj_path if needed
|
|
1416
1547
|
if mmproj_path is not None:
|
|
1417
1548
|
try:
|
|
1418
|
-
downloaded_mmproj_path = _download_model_if_needed(
|
|
1549
|
+
downloaded_mmproj_path, _, _ = _download_model_if_needed(
|
|
1419
1550
|
mmproj_path, 'mmproj_path', progress_callback, token, is_mmproj=True, **kwargs
|
|
1420
1551
|
)
|
|
1421
1552
|
|
|
@@ -1427,5 +1558,5 @@ def auto_download_model(func: Callable) -> Callable:
|
|
|
1427
1558
|
|
|
1428
1559
|
# Call original function with updated paths (outside try-catch to let model creation errors bubble up)
|
|
1429
1560
|
return func(*args, **kwargs)
|
|
1430
|
-
|
|
1561
|
+
|
|
1431
1562
|
return wrapper
|
nexaai/vlm.py
CHANGED
|
@@ -22,7 +22,8 @@ class VLM(BaseModel):
|
|
|
22
22
|
model_name: Optional[str] = None,
|
|
23
23
|
m_cfg: ModelConfig = ModelConfig(),
|
|
24
24
|
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
25
|
-
device_id: Optional[str] = None
|
|
25
|
+
device_id: Optional[str] = None,
|
|
26
|
+
**kwargs
|
|
26
27
|
) -> 'VLM':
|
|
27
28
|
"""Load VLM model from local path, routing to appropriate implementation.
|
|
28
29
|
|
|
@@ -99,7 +100,8 @@ class VLM(BaseModel):
|
|
|
99
100
|
def apply_chat_template(
|
|
100
101
|
self,
|
|
101
102
|
messages: List[MultiModalMessage],
|
|
102
|
-
tools: Optional[List[Dict[str, Any]]] = None
|
|
103
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
104
|
+
enable_thinking: bool = True
|
|
103
105
|
) -> str:
|
|
104
106
|
"""Apply the chat template to multimodal messages."""
|
|
105
107
|
pass
|
nexaai/vlm_impl/mlx_vlm_impl.py
CHANGED
|
@@ -72,7 +72,8 @@ class MlxVlmImpl(VLM):
|
|
|
72
72
|
def apply_chat_template(
|
|
73
73
|
self,
|
|
74
74
|
messages: List[MultiModalMessage],
|
|
75
|
-
tools: Optional[List[Dict[str, Any]]] = None
|
|
75
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
76
|
+
enable_thinking: bool = True
|
|
76
77
|
) -> str:
|
|
77
78
|
"""Apply the chat template to multimodal messages."""
|
|
78
79
|
if not self._mlx_vlm:
|
|
@@ -116,7 +117,7 @@ class MlxVlmImpl(VLM):
|
|
|
116
117
|
num_images=total_images,
|
|
117
118
|
num_audios=total_audios,
|
|
118
119
|
tools=tools,
|
|
119
|
-
enable_thinking=
|
|
120
|
+
enable_thinking=enable_thinking
|
|
120
121
|
)
|
|
121
122
|
else:
|
|
122
123
|
# Use regular apply_chat_template for text-only messages
|
|
@@ -8,6 +8,11 @@ from nexaai.binds import vlm_bind, common_bind
|
|
|
8
8
|
from nexaai.runtime import _ensure_runtime
|
|
9
9
|
from nexaai.vlm import VLM
|
|
10
10
|
from nexaai.base import ProfilingData
|
|
11
|
+
from nexaai.runtime_error import ContextLengthExceededError, GenerationError
|
|
12
|
+
|
|
13
|
+
# Error codes from ml.h
|
|
14
|
+
ML_SUCCESS = 0
|
|
15
|
+
ML_ERROR_LLM_TOKENIZATION_CONTEXT_LENGTH = -200004
|
|
11
16
|
|
|
12
17
|
|
|
13
18
|
class PyBindVLMImpl(VLM):
|
|
@@ -68,7 +73,7 @@ class PyBindVLMImpl(VLM):
|
|
|
68
73
|
handle = vlm_bind.create_vlm(
|
|
69
74
|
model_path=local_path,
|
|
70
75
|
mmproj_path=mmproj_path,
|
|
71
|
-
|
|
76
|
+
model_name=model_name,
|
|
72
77
|
model_config=config,
|
|
73
78
|
plugin_id=plugin_id_str,
|
|
74
79
|
device_id=device_id
|
|
@@ -91,7 +96,8 @@ class PyBindVLMImpl(VLM):
|
|
|
91
96
|
def apply_chat_template(
|
|
92
97
|
self,
|
|
93
98
|
messages: List[MultiModalMessage],
|
|
94
|
-
tools: Optional[List[Dict[str, Any]]] = None
|
|
99
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
100
|
+
enable_thinking: bool = True
|
|
95
101
|
) -> str:
|
|
96
102
|
"""Apply the chat template to multimodal messages."""
|
|
97
103
|
payload = []
|
|
@@ -103,15 +109,14 @@ class PyBindVLMImpl(VLM):
|
|
|
103
109
|
t = c["type"]
|
|
104
110
|
if t == "text":
|
|
105
111
|
blocks.append({"type": "text", "text": c.get("text","") or ""})
|
|
106
|
-
elif t == "image":
|
|
107
|
-
# Pass through the original structure - let vlm-bind.cpp handle field extraction
|
|
108
|
-
blocks.append(c)
|
|
109
112
|
else:
|
|
110
|
-
|
|
113
|
+
# Pass through the original structure for image, audio, and any other types
|
|
114
|
+
# Let vlm-bind.cpp handle field extraction (text/url/path)
|
|
115
|
+
blocks.append(c)
|
|
111
116
|
|
|
112
117
|
payload.append({"role": role, "content": blocks})
|
|
113
118
|
|
|
114
|
-
result = vlm_bind.ml_vlm_apply_chat_template(self._handle, payload, tools)
|
|
119
|
+
result = vlm_bind.ml_vlm_apply_chat_template(self._handle, payload, tools, enable_thinking)
|
|
115
120
|
return result
|
|
116
121
|
|
|
117
122
|
def generate_stream(self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()) -> Generator[str, None, None]:
|
|
@@ -143,6 +148,18 @@ class PyBindVLMImpl(VLM):
|
|
|
143
148
|
on_token=on_token,
|
|
144
149
|
user_data=None
|
|
145
150
|
)
|
|
151
|
+
|
|
152
|
+
# Check for errors in result
|
|
153
|
+
error_code = result.get("error_code", ML_SUCCESS)
|
|
154
|
+
if error_code != ML_SUCCESS:
|
|
155
|
+
error_message = result.get("error_message", "Unknown error")
|
|
156
|
+
if error_code == ML_ERROR_LLM_TOKENIZATION_CONTEXT_LENGTH:
|
|
157
|
+
exception_container[0] = ContextLengthExceededError(error_message, error_code)
|
|
158
|
+
else:
|
|
159
|
+
exception_container[0] = GenerationError(error_message, error_code)
|
|
160
|
+
token_queue.put(('end', None))
|
|
161
|
+
return
|
|
162
|
+
|
|
146
163
|
self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
|
|
147
164
|
except Exception as e:
|
|
148
165
|
exception_container[0] = e
|
|
@@ -186,6 +203,15 @@ class PyBindVLMImpl(VLM):
|
|
|
186
203
|
user_data=None
|
|
187
204
|
)
|
|
188
205
|
|
|
206
|
+
# Check for errors in result
|
|
207
|
+
error_code = result.get("error_code", ML_SUCCESS)
|
|
208
|
+
if error_code != ML_SUCCESS:
|
|
209
|
+
error_message = result.get("error_message", "Unknown error")
|
|
210
|
+
if error_code == ML_ERROR_LLM_TOKENIZATION_CONTEXT_LENGTH:
|
|
211
|
+
raise ContextLengthExceededError(error_message, error_code)
|
|
212
|
+
else:
|
|
213
|
+
raise GenerationError(error_message, error_code)
|
|
214
|
+
|
|
189
215
|
self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
|
|
190
216
|
return result.get("text", "")
|
|
191
217
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nexaai
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.21
|
|
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
|
|
@@ -14,7 +14,6 @@ Requires-Python: >=3.7
|
|
|
14
14
|
Description-Content-Type: text/markdown
|
|
15
15
|
Requires-Dist: huggingface_hub
|
|
16
16
|
Requires-Dist: tqdm
|
|
17
|
-
Requires-Dist: hf_xet
|
|
18
17
|
Requires-Dist: numpy
|
|
19
18
|
Requires-Dist: httpx
|
|
20
19
|
Provides-Extra: mlx
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
nexaai/__init__.py,sha256=Yt2YPVcRfwdA6DQoUR4ZI34CHBUYoY2cVsrG7Zp6IrI,2516
|
|
2
|
+
nexaai/_stub.cp310-win_amd64.pyd,sha256=_QbFX3wuGKK6K-BSlRZsT36BQSQcjCfVyrxNQ4HayMY,10752
|
|
3
|
+
nexaai/_version.py,sha256=i_1Tr2pxCUBFuFhyyzXbVSdeA2pezaJC9mGecjSiUTg,143
|
|
4
|
+
nexaai/asr.py,sha256=p_bTRqESa-4g6V3HGFzi8vqn8H4Q6yTLiLjL0yqVr3I,2362
|
|
5
|
+
nexaai/base.py,sha256=qQBCiQVNzgpkQjZX9aiFDEdbAAe56TROKC3WnWra2Zg,1021
|
|
6
|
+
nexaai/common.py,sha256=XRwjvRNxS2xRVb0CMR5NbPQ4E-PAewJ0m6VGbZOw19A,3565
|
|
7
|
+
nexaai/cv.py,sha256=PhgqK5hO8FlXLR6QxE_pHtXjdtzLSEPzkCda-qrNpOs,3395
|
|
8
|
+
nexaai/embedder.py,sha256=fzIdlE52SSVNurIFZgf9gKtRf2SXysARsETQmkiCWs0,2625
|
|
9
|
+
nexaai/image_gen.py,sha256=_kLLCbvhc30a-YGidkB13ZXYoPOS-sKMo8bKVRkUado,4526
|
|
10
|
+
nexaai/llm.py,sha256=woB98NQmaNf3_BH0Ogig3niU1rcD8YtHPiSpzyrbVmo,3771
|
|
11
|
+
nexaai/log.py,sha256=F_Qe169kLbnFV25WJmS_ZtmBfOdcGic8BYFIsYVoD_o,2720
|
|
12
|
+
nexaai/rerank.py,sha256=kzNpC3RG6fr1WnG60fm0ixuORBeG7gq90h6BnS9vIK4,2025
|
|
13
|
+
nexaai/runtime.py,sha256=_BoAtTUv5ZR7wtOlJL5TldR3AZTP0OnMWjB9p71k-8E,2135
|
|
14
|
+
nexaai/runtime_error.py,sha256=7TvjMJO7MpvVRQCYEDwcFPOgZsIILQtN-ZJ74JlARrE,803
|
|
15
|
+
nexaai/tts.py,sha256=5lEzv50Q5iLTNHLg3kX-4J_mi1T_t-rVdZzOwd6sALY,2271
|
|
16
|
+
nexaai/vlm.py,sha256=uglZ5g0VFizwIYOYjXg-LNrr5baFanTRlAppEkkF-Yw,4929
|
|
17
|
+
nexaai/asr_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
nexaai/asr_impl/mlx_asr_impl.py,sha256=XwMX3LYMeulp8cDS0TCCYcjvttFHAyDWQ_oMvABwQmI,3349
|
|
19
|
+
nexaai/asr_impl/pybind_asr_impl.py,sha256=I-J_pp4Tdafa-ipp34q2dN4dbL905nlpBYVBGLQwLVI,4807
|
|
20
|
+
nexaai/binds/__init__.py,sha256=cDlzRJF5pq0YmiwmUvdNO9CrvYrBdkYWR4xXrEbwLyU,161
|
|
21
|
+
nexaai/binds/asr_bind.cp310-win_amd64.pyd,sha256=SlrRkDL0NcDbOurVMpMYjKBYSZOw92x3gVA35lkmk9w,192000
|
|
22
|
+
nexaai/binds/common_bind.cp310-win_amd64.pyd,sha256=BFC93AlT1-xeemnp8KY4oQht0CF7cmEcMx74gd_ZaWA,205824
|
|
23
|
+
nexaai/binds/embedder_bind.cp310-win_amd64.pyd,sha256=sFdwwzXBZeWbovrIlz86mc84YlunU57UaYOuT57cJNM,183808
|
|
24
|
+
nexaai/binds/libcrypto-3-x64.dll,sha256=X7hDuQPMn6eRe58dTGJxTmRPKFWgd5i6Gjoy9QPLmPg,7315968
|
|
25
|
+
nexaai/binds/libssl-3-x64.dll,sha256=GRw0cOaGUaR2QHRvBFuU_9S9iNgkyVgm0NIpZMnReAw,1313792
|
|
26
|
+
nexaai/binds/llm_bind.cp310-win_amd64.pyd,sha256=MfSPKQ7eqOUXXknXDE4lR7NRv20UQbaQzbtzLX-C-AE,163840
|
|
27
|
+
nexaai/binds/nexa_bridge.dll,sha256=VwFs7iWC5DR0-O3m6jH66MjwEU_X7depcwWsUt7x7II,190976
|
|
28
|
+
nexaai/binds/rerank_bind.cp310-win_amd64.pyd,sha256=AdTNfqvHF7RGJQHr4dYBeMLIw2HG0TMx8zPcxLJWRZQ,178176
|
|
29
|
+
nexaai/binds/vlm_bind.cp310-win_amd64.pyd,sha256=Fa63mi-qBbS96JYSVvQ2dH3sdtLFAQ6XToE8C17DWQY,171520
|
|
30
|
+
nexaai/binds/cpu_gpu/ggml-base.dll,sha256=x7EWkh8cQpKi6b4lZ8RI4Vu7gWZwzyil6z5FgIS1ZUc,532480
|
|
31
|
+
nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=UPVtRw9rjHE3vmjGHy9lpLgtkpRd2O38BerNX4XKxq8,672768
|
|
32
|
+
nexaai/binds/cpu_gpu/ggml-cuda.dll,sha256=nOsSFjXZ4K2DoDI0SOjVU3idv-BJCX590KuUoLkEb7o,313528832
|
|
33
|
+
nexaai/binds/cpu_gpu/ggml-vulkan.dll,sha256=4ZiBpWZTaUbHPHfax-PjSmTXyCMDpEMIcFIU-SheKGs,36627968
|
|
34
|
+
nexaai/binds/cpu_gpu/ggml.dll,sha256=T9GTViGQInMb7JlBAasURiNjf8Q2RBr9ug7SprXqMmA,66560
|
|
35
|
+
nexaai/binds/cpu_gpu/mtmd.dll,sha256=r-YFHScZ_EcuzTsYHCr4stGvgfkYDnIPNrJm-6Fygfs,561152
|
|
36
|
+
nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=fys-UB42teAkZshFHV4B8186JAM_gta9b_m6XqOWK7w,1611776
|
|
37
|
+
nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256=-QYXwum-B-GX8FwxquwwwBnZ9IzKCwH4ufocGPR4iYc,1424384
|
|
38
|
+
nexaai/binds/nexaml/ggml-base.dll,sha256=x7EWkh8cQpKi6b4lZ8RI4Vu7gWZwzyil6z5FgIS1ZUc,532480
|
|
39
|
+
nexaai/binds/nexaml/ggml-cpu.dll,sha256=UPVtRw9rjHE3vmjGHy9lpLgtkpRd2O38BerNX4XKxq8,672768
|
|
40
|
+
nexaai/binds/nexaml/ggml-cuda.dll,sha256=nOsSFjXZ4K2DoDI0SOjVU3idv-BJCX590KuUoLkEb7o,313528832
|
|
41
|
+
nexaai/binds/nexaml/ggml-vulkan.dll,sha256=4ZiBpWZTaUbHPHfax-PjSmTXyCMDpEMIcFIU-SheKGs,36627968
|
|
42
|
+
nexaai/binds/nexaml/ggml.dll,sha256=T9GTViGQInMb7JlBAasURiNjf8Q2RBr9ug7SprXqMmA,66560
|
|
43
|
+
nexaai/binds/nexaml/nexa-mm-process.dll,sha256=DDD5qPbelZAIrRWGggOd3Pg9U_fh_ZEYIplwqiyD5LY,4643328
|
|
44
|
+
nexaai/binds/nexaml/nexa-sampling.dll,sha256=Notkz287laSUG2_ED3oFXWVLJM3t7x_USkvX6wKVOLA,4265984
|
|
45
|
+
nexaai/binds/nexaml/nexa_plugin.dll,sha256=DTM4Q6gFd0X1TELi_sB8GOJ0muj9HNOpSK2ddlhkJ1c,604160
|
|
46
|
+
nexaai/binds/nexaml/nexaproc.dll,sha256=rRcdSfhkxnRwktXW4lp7Np8sNY_uefNXYwAmPp34AHg,2670080
|
|
47
|
+
nexaai/binds/nexaml/qwen3-vl.dll,sha256=k0wPZNR6VejeR32KuFgCVyj7t7YaEmZOKhj9lwMw0-s,5874176
|
|
48
|
+
nexaai/binds/nexaml/qwen3vl-vision.dll,sha256=5AX4MtAOWTcXSAkS2qqvl2pFti4HR55dtkCaOO03Evc,1063424
|
|
49
|
+
nexaai/cv_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
nexaai/cv_impl/mlx_cv_impl.py,sha256=QLd_8w90gtxH8kmssaDYatCTRvQNIJuUGKZNnYrmx6E,3317
|
|
51
|
+
nexaai/cv_impl/pybind_cv_impl.py,sha256=aSOCAxmHrwJbEkSN6VX3Cykqlj_9RIpVrZXILul04GA,1096
|
|
52
|
+
nexaai/embedder_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
nexaai/embedder_impl/mlx_embedder_impl.py,sha256=WWTQrUWEMq1kLGg4CBQyu59zD2hIptghVEQXQAcx7hM,4757
|
|
54
|
+
nexaai/embedder_impl/pybind_embedder_impl.py,sha256=Xsf4nczEzpRDqdx96DEu5GwLxGcSV06ZVnEV3a5-q68,3749
|
|
55
|
+
nexaai/image_gen_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
+
nexaai/image_gen_impl/mlx_image_gen_impl.py,sha256=peUE9ue9ApaPlZVOICBWiHtd13sY40OWQbE8EjfIUMU,11511
|
|
57
|
+
nexaai/image_gen_impl/pybind_image_gen_impl.py,sha256=514RFQMSO0Rhacq0IYzlEhEr6QfaprnGew0Rjz8HZI4,3777
|
|
58
|
+
nexaai/llm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
|
+
nexaai/llm_impl/mlx_llm_impl.py,sha256=qJY0zwb6jfVFQnTsp1W7BDnIMdgcJlqnU5UJgSoU-Vs,11567
|
|
60
|
+
nexaai/llm_impl/pybind_llm_impl.py,sha256=zzZZ2FovnNn9EJxjovNhLI_SDjt3MAXMi8jsR6N57Ng,8359
|
|
61
|
+
nexaai/rerank_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
|
+
nexaai/rerank_impl/mlx_rerank_impl.py,sha256=fZtf9lKT6dCiiFUmRkm4EDWRPTkRBl7pG3mHEZMp6_o,3471
|
|
63
|
+
nexaai/rerank_impl/pybind_rerank_impl.py,sha256=_1pkeD76kZK-S-2IFJzRxvxvQdgoS3Yi2WhIbWq4bxU,4626
|
|
64
|
+
nexaai/tts_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
+
nexaai/tts_impl/mlx_tts_impl.py,sha256=LcH9bVdIl3Q6lOzSUB_X2s-_nWFmlCl1yL7XSUK0fYI,3195
|
|
66
|
+
nexaai/tts_impl/pybind_tts_impl.py,sha256=n3z4zmPQayQJgAwcvETw0IBUCp8IYROuYFSg0tAy_8Y,1487
|
|
67
|
+
nexaai/utils/decode.py,sha256=0Z9jDH4ICzw4YXj8nD4L-sMouDaev-TISGRQ4KzidWE,421
|
|
68
|
+
nexaai/utils/manifest_utils.py,sha256=BoKqnI6N5CkEPTDZCRWSx7wga6aH8h6cr4nbff7gVwg,22020
|
|
69
|
+
nexaai/utils/model_manager.py,sha256=IN5t7MV0guHfKKkbGYnw4bDDk088F9lgmtNFiqEhGN8,67674
|
|
70
|
+
nexaai/utils/model_types.py,sha256=q2m7diYLOpLvRl1ixL2eMq5_kdTj8KqPBGWX4p6Ob08,1532
|
|
71
|
+
nexaai/utils/progress_tracker.py,sha256=BztrFqtjwNUmeREwZ5m7H6ZcrVzQEbpZfsxndWh4z0A,15778
|
|
72
|
+
nexaai/utils/quantization_utils.py,sha256=FxnZ6-uAE_bl_vQ5jsRXlpU0NBn-U4Y8iN9_O6aCdPA,8070
|
|
73
|
+
nexaai/vlm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
|
+
nexaai/vlm_impl/mlx_vlm_impl.py,sha256=gI09QJcok68QG-36csXr3c2yPCZXTE0dlq1MUBEo_Ms,11091
|
|
75
|
+
nexaai/vlm_impl/pybind_vlm_impl.py,sha256=w8gAZNW2lk3mCKolg4iKgD58RhHCEk4v9aYI1RwVGqc,10021
|
|
76
|
+
nexaai-1.0.21.dist-info/METADATA,sha256=QDe6JKuYoDbb8frPConGluKRownepYjjvqE5G10ixiw,1215
|
|
77
|
+
nexaai-1.0.21.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
|
|
78
|
+
nexaai-1.0.21.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
|
|
79
|
+
nexaai-1.0.21.dist-info/RECORD,,
|
nexaai-1.0.20.dist-info/RECORD
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
nexaai/__init__.py,sha256=mbzzeXrEHHI_E3BQ0_OukD9wNajKJJVk0ykxT0rz8uM,2267
|
|
2
|
-
nexaai/_stub.cp310-win_amd64.pyd,sha256=Efpmsr8o9_ipQ75vdg7mSVW9cDblaJR8WTv-Vbw0z5g,10752
|
|
3
|
-
nexaai/_version.py,sha256=YQby4GMX_eKc_N1oaIy8c7_k8XB5jYqAA-LTQGOHYpk,143
|
|
4
|
-
nexaai/asr.py,sha256=_fsGaxpiU137bUtO5ujtFSYCI1RLsyeEm3Gf4GhHVRk,2118
|
|
5
|
-
nexaai/base.py,sha256=qQBCiQVNzgpkQjZX9aiFDEdbAAe56TROKC3WnWra2Zg,1021
|
|
6
|
-
nexaai/common.py,sha256=muQqFY-WllwL5IO83tImexbuUcoEQsKg73u4gWL2lNs,3548
|
|
7
|
-
nexaai/cv.py,sha256=a6-csgYNDzPziJ0EojE9-BeM_xCny4UvWWbpnJ7GL-A,3365
|
|
8
|
-
nexaai/embedder.py,sha256=3a81s7JapvYxCRbWPFKp_9EWBKW7WYqF03gk87YuGKU,2524
|
|
9
|
-
nexaai/image_gen.py,sha256=4iASOKxJosMznLarTvOxJQDNaas251O81bfUWJTUBfE,4496
|
|
10
|
-
nexaai/llm.py,sha256=Qwm1q_NStLfD-JYZQIvxniWnAmwNl1V6LUON3Me7w_I,3663
|
|
11
|
-
nexaai/log.py,sha256=F_Qe169kLbnFV25WJmS_ZtmBfOdcGic8BYFIsYVoD_o,2720
|
|
12
|
-
nexaai/rerank.py,sha256=_zGWmX6eDigY2kViMKCtNssp4JMEeVycZZfJH9eAZOY,1927
|
|
13
|
-
nexaai/runtime.py,sha256=_BoAtTUv5ZR7wtOlJL5TldR3AZTP0OnMWjB9p71k-8E,2135
|
|
14
|
-
nexaai/tts.py,sha256=afs6sx0w0Tvs_aJlyZRPm62qQpTrs-fW_jDHrMkc4AA,2241
|
|
15
|
-
nexaai/vlm.py,sha256=wUMbRURluxvULbS7vgyHsWdEPgLGrrC_S79bhdEN7Vg,4860
|
|
16
|
-
nexaai/asr_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
nexaai/asr_impl/mlx_asr_impl.py,sha256=XwMX3LYMeulp8cDS0TCCYcjvttFHAyDWQ_oMvABwQmI,3349
|
|
18
|
-
nexaai/asr_impl/pybind_asr_impl.py,sha256=20o5SOPzhF9x41ra8L_qIM7YxCkYeLb5csSrNde-dds,1560
|
|
19
|
-
nexaai/binds/__init__.py,sha256=ENl-uoIF9-3XGIXitVgZ2QmJ6p7Yet4h1-X7nUDZ0Hk,108
|
|
20
|
-
nexaai/binds/common_bind.cp310-win_amd64.pyd,sha256=oiNbKJtiPnP4aIOkKMxR4Vl3O-6gNWUOtiAqx3aG8AA,205824
|
|
21
|
-
nexaai/binds/embedder_bind.cp310-win_amd64.pyd,sha256=TpTTLaLmFVFa8BiTE5zX-6FZ9IZKoq9MUBqyimJpA7A,182784
|
|
22
|
-
nexaai/binds/libcrypto-3-x64.dll,sha256=X7hDuQPMn6eRe58dTGJxTmRPKFWgd5i6Gjoy9QPLmPg,7315968
|
|
23
|
-
nexaai/binds/libssl-3-x64.dll,sha256=GRw0cOaGUaR2QHRvBFuU_9S9iNgkyVgm0NIpZMnReAw,1313792
|
|
24
|
-
nexaai/binds/llm_bind.cp310-win_amd64.pyd,sha256=Kh4F7bqWvVQA9eZkEwTSTpQRuznOhVYeELhOsGMQyzo,162816
|
|
25
|
-
nexaai/binds/nexa_bridge.dll,sha256=F71KwL9PeUz9e1eDt5rSLP1nee5hc8_ekfpMYh2sJ0k,187904
|
|
26
|
-
nexaai/binds/vlm_bind.cp310-win_amd64.pyd,sha256=FyyI4GrYnVCMUIXfzdkxNERlgMMGjA4qSSlmFhJYDBA,168960
|
|
27
|
-
nexaai/binds/cpu_gpu/ggml-base.dll,sha256=Ws7NWfpdEn_QTL8gnh_sUz_J0K179Yl241uM4P0JGVw,532480
|
|
28
|
-
nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=RanyT0m4REZJYz04ixpbhd87lemnUrzhCNXtdsDqbLY,672768
|
|
29
|
-
nexaai/binds/cpu_gpu/ggml-cuda.dll,sha256=ex7fxyZe2KPcxkgfxSBrjf2oIgf7jbE1Rt74ywKyAls,313528832
|
|
30
|
-
nexaai/binds/cpu_gpu/ggml-vulkan.dll,sha256=wGkKnEdCLKw0vWLH51GRuuzR8Lum9ta6Xh1Lge1zeFg,36627968
|
|
31
|
-
nexaai/binds/cpu_gpu/ggml.dll,sha256=XBQajP9P05YqqzJ-0sADsb0luzbwWomxdI5nwpsnzqw,66560
|
|
32
|
-
nexaai/binds/cpu_gpu/mtmd.dll,sha256=Z5r0VXuuFYZqwQBAutN2P378mF9zFFayxYRTa8BjeQk,561152
|
|
33
|
-
nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=36jvlF5lKsOiQZuAY-QdXRNm1vQwZY5xFjX5MHUt7eI,1611776
|
|
34
|
-
nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256=Bv65TVCcZZ_CVjjMbbnwV4Jb5wZ0ILONDn0w95YABwQ,1411072
|
|
35
|
-
nexaai/binds/nexaml/ggml-base.dll,sha256=Ws7NWfpdEn_QTL8gnh_sUz_J0K179Yl241uM4P0JGVw,532480
|
|
36
|
-
nexaai/binds/nexaml/ggml-cpu.dll,sha256=RanyT0m4REZJYz04ixpbhd87lemnUrzhCNXtdsDqbLY,672768
|
|
37
|
-
nexaai/binds/nexaml/ggml-cuda.dll,sha256=ex7fxyZe2KPcxkgfxSBrjf2oIgf7jbE1Rt74ywKyAls,313528832
|
|
38
|
-
nexaai/binds/nexaml/ggml-vulkan.dll,sha256=wGkKnEdCLKw0vWLH51GRuuzR8Lum9ta6Xh1Lge1zeFg,36627968
|
|
39
|
-
nexaai/binds/nexaml/ggml.dll,sha256=XBQajP9P05YqqzJ-0sADsb0luzbwWomxdI5nwpsnzqw,66560
|
|
40
|
-
nexaai/binds/nexaml/nexa-mm-process.dll,sha256=DDD5qPbelZAIrRWGggOd3Pg9U_fh_ZEYIplwqiyD5LY,4643328
|
|
41
|
-
nexaai/binds/nexaml/nexa-sampling.dll,sha256=Notkz287laSUG2_ED3oFXWVLJM3t7x_USkvX6wKVOLA,4265984
|
|
42
|
-
nexaai/binds/nexaml/nexa_plugin.dll,sha256=6nvov9eZ7Y5eJVFzCzrmaGesweplmSOv_2L6s6wsXEU,601600
|
|
43
|
-
nexaai/binds/nexaml/nexaproc.dll,sha256=cVU4ngSdsQ0MttqOv5IUZhmUE8lZLq-OjC8ueaAsx1s,2668544
|
|
44
|
-
nexaai/binds/nexaml/qwen3-vl.dll,sha256=say_RLwLsIq_svPlgqPl12gfrOCQtcCiwa_q91Ql7YM,5873152
|
|
45
|
-
nexaai/binds/nexaml/qwen3vl-vision.dll,sha256=5AX4MtAOWTcXSAkS2qqvl2pFti4HR55dtkCaOO03Evc,1063424
|
|
46
|
-
nexaai/cv_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
|
-
nexaai/cv_impl/mlx_cv_impl.py,sha256=QLd_8w90gtxH8kmssaDYatCTRvQNIJuUGKZNnYrmx6E,3317
|
|
48
|
-
nexaai/cv_impl/pybind_cv_impl.py,sha256=aSOCAxmHrwJbEkSN6VX3Cykqlj_9RIpVrZXILul04GA,1096
|
|
49
|
-
nexaai/embedder_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
-
nexaai/embedder_impl/mlx_embedder_impl.py,sha256=Kzd-veLNl95FbI2oEJMtr6qKbjtPDDajzsGUVjJfTRA,4598
|
|
51
|
-
nexaai/embedder_impl/pybind_embedder_impl.py,sha256=eH2L--L6BAl-46UOzm84pfjIkJtQKVd63-r62eb0Vg0,3670
|
|
52
|
-
nexaai/image_gen_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
nexaai/image_gen_impl/mlx_image_gen_impl.py,sha256=peUE9ue9ApaPlZVOICBWiHtd13sY40OWQbE8EjfIUMU,11511
|
|
54
|
-
nexaai/image_gen_impl/pybind_image_gen_impl.py,sha256=514RFQMSO0Rhacq0IYzlEhEr6QfaprnGew0Rjz8HZI4,3777
|
|
55
|
-
nexaai/llm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
-
nexaai/llm_impl/mlx_llm_impl.py,sha256=r9Qa1ZuduRAcRjmqo2J_zlqhprVPe3ioZtUbi7yIvYY,11426
|
|
57
|
-
nexaai/llm_impl/pybind_llm_impl.py,sha256=s2Cb035xDbh1ZhGNys0LRtAR6b6n4-YVKSC5voD4_Tk,8269
|
|
58
|
-
nexaai/rerank_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
|
-
nexaai/rerank_impl/mlx_rerank_impl.py,sha256=x8L6zCccV2I4bq4V5zAOcrWFe5Ckle7z5J_00tao8bI,3335
|
|
60
|
-
nexaai/rerank_impl/pybind_rerank_impl.py,sha256=1IW925bYv4FRwZDNzf9epEzdDqR6T3OONgTLBd-cOn8,1556
|
|
61
|
-
nexaai/tts_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
|
-
nexaai/tts_impl/mlx_tts_impl.py,sha256=LcH9bVdIl3Q6lOzSUB_X2s-_nWFmlCl1yL7XSUK0fYI,3195
|
|
63
|
-
nexaai/tts_impl/pybind_tts_impl.py,sha256=n3z4zmPQayQJgAwcvETw0IBUCp8IYROuYFSg0tAy_8Y,1487
|
|
64
|
-
nexaai/utils/decode.py,sha256=0Z9jDH4ICzw4YXj8nD4L-sMouDaev-TISGRQ4KzidWE,421
|
|
65
|
-
nexaai/utils/manifest_utils.py,sha256=E07t_bNq-EDrqVYZW7uyX8zsKsFklvqqwSvic0in0tQ,21800
|
|
66
|
-
nexaai/utils/model_manager.py,sha256=qzlGP4sZLYsO72vg-EUCVA0RUknVKtLYMmDDfPmG45g,60999
|
|
67
|
-
nexaai/utils/model_types.py,sha256=q2m7diYLOpLvRl1ixL2eMq5_kdTj8KqPBGWX4p6Ob08,1532
|
|
68
|
-
nexaai/utils/progress_tracker.py,sha256=BztrFqtjwNUmeREwZ5m7H6ZcrVzQEbpZfsxndWh4z0A,15778
|
|
69
|
-
nexaai/utils/quantization_utils.py,sha256=FxnZ6-uAE_bl_vQ5jsRXlpU0NBn-U4Y8iN9_O6aCdPA,8070
|
|
70
|
-
nexaai/vlm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
-
nexaai/vlm_impl/mlx_vlm_impl.py,sha256=MgqJO7OzuPd79gOZZKhSXXMNSP2eBuhhrdCX8XHn6aQ,11090
|
|
72
|
-
nexaai/vlm_impl/pybind_vlm_impl.py,sha256=NuQ_Ep1TnjmGAkjJuUS0Lb6z7iPu3wroLVOx7kiAwlE,8827
|
|
73
|
-
nexaai-1.0.20.dist-info/METADATA,sha256=K2V5GVx_4VMBYf-ki7CpTOKuWrpxhc4lSGYpY5zl_rs,1238
|
|
74
|
-
nexaai-1.0.20.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
|
|
75
|
-
nexaai-1.0.20.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
|
|
76
|
-
nexaai-1.0.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|