nexaai 1.0.23__cp313-cp313-win_arm64.whl → 1.0.24__cp313-cp313-win_arm64.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 +15 -11
- nexaai/_stub.cp313-win_arm64.pyd +0 -0
- nexaai/_version.py +1 -1
- nexaai/binds/__init__.py +1 -0
- nexaai/binds/asr_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/common_bind.cp313-win_arm64.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-opencl.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/cv_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/diarize_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/embedder_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/llm_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/nexa_bridge.dll +0 -0
- nexaai/binds/npu/ggml-base.dll +0 -0
- nexaai/binds/npu/ggml-cpu.dll +0 -0
- nexaai/binds/npu/ggml-opencl.dll +0 -0
- nexaai/binds/npu/ggml.dll +0 -0
- nexaai/binds/npu/granite-nano-sdk.dll +0 -0
- nexaai/binds/npu/nexa-mm-process.dll +0 -0
- nexaai/binds/npu/nexa_plugin.dll +0 -0
- nexaai/binds/npu/pyannote-sdk.dll +0 -0
- nexaai/binds/rerank_bind.cp313-win_arm64.pyd +0 -0
- nexaai/binds/vlm_bind.cp313-win_arm64.pyd +0 -0
- nexaai/common.py +1 -0
- nexaai/diarize.py +80 -0
- nexaai/diarize_impl/__init__.py +1 -0
- nexaai/diarize_impl/pybind_diarize_impl.py +125 -0
- nexaai/llm_impl/pybind_llm_impl.py +44 -26
- nexaai/vlm_impl/pybind_vlm_impl.py +50 -31
- {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/METADATA +1 -1
- {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/RECORD +38 -34
- {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/WHEEL +0 -0
- {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/top_level.txt +0 -0
nexaai/__init__.py
CHANGED
|
@@ -28,7 +28,7 @@ from .log import set_logger, get_error_message
|
|
|
28
28
|
from .runtime_error import (
|
|
29
29
|
NexaRuntimeError,
|
|
30
30
|
ContextLengthExceededError,
|
|
31
|
-
GenerationError
|
|
31
|
+
GenerationError,
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
# Create alias for PluginID to be accessible as plugin_id
|
|
@@ -41,30 +41,34 @@ from .vlm import VLM
|
|
|
41
41
|
from .asr import ASR, ASRConfig, ASRResult
|
|
42
42
|
from .cv import CVModel, CVModelConfig, CVResult, CVResults, CVCapabilities, BoundingBox
|
|
43
43
|
from .rerank import Reranker, RerankConfig
|
|
44
|
-
from .image_gen import
|
|
44
|
+
from .image_gen import (
|
|
45
|
+
ImageGen,
|
|
46
|
+
ImageGenerationConfig,
|
|
47
|
+
ImageSamplerConfig,
|
|
48
|
+
SchedulerConfig,
|
|
49
|
+
Image,
|
|
50
|
+
)
|
|
45
51
|
from .tts import TTS, TTSConfig, TTSSamplerConfig, TTSResult
|
|
52
|
+
from .diarize import Diarize, DiarizeConfig, DiarizeResult, SpeechSegment
|
|
46
53
|
|
|
47
54
|
# Build __all__ list dynamically
|
|
48
55
|
__all__ = [
|
|
49
56
|
"__version__",
|
|
50
57
|
# Common configurations (always available)
|
|
51
58
|
"ModelConfig",
|
|
52
|
-
"GenerationConfig",
|
|
59
|
+
"GenerationConfig",
|
|
53
60
|
"ChatMessage",
|
|
54
61
|
"SamplerConfig",
|
|
55
62
|
"EmbeddingConfig",
|
|
56
63
|
"PluginID",
|
|
57
64
|
"plugin_id",
|
|
58
|
-
|
|
59
65
|
# Logging functionality
|
|
60
66
|
"set_logger",
|
|
61
67
|
"get_error_message",
|
|
62
|
-
|
|
63
68
|
# Runtime errors
|
|
64
69
|
"NexaRuntimeError",
|
|
65
70
|
"ContextLengthExceededError",
|
|
66
71
|
"GenerationError",
|
|
67
|
-
|
|
68
72
|
"LLM",
|
|
69
73
|
"Embedder",
|
|
70
74
|
"VLM",
|
|
@@ -73,12 +77,12 @@ __all__ = [
|
|
|
73
77
|
"Reranker",
|
|
74
78
|
"ImageGen",
|
|
75
79
|
"TTS",
|
|
76
|
-
|
|
80
|
+
"Diarize",
|
|
77
81
|
"ASRConfig",
|
|
78
82
|
"ASRResult",
|
|
79
83
|
"CVModelConfig",
|
|
80
84
|
"CVResult",
|
|
81
|
-
"CVResults",
|
|
85
|
+
"CVResults",
|
|
82
86
|
"CVCapabilities",
|
|
83
87
|
"BoundingBox",
|
|
84
88
|
"RerankConfig",
|
|
@@ -89,7 +93,7 @@ __all__ = [
|
|
|
89
93
|
"TTSConfig",
|
|
90
94
|
"TTSSamplerConfig",
|
|
91
95
|
"TTSResult",
|
|
96
|
+
"DiarizeConfig",
|
|
97
|
+
"DiarizeResult",
|
|
98
|
+
"SpeechSegment",
|
|
92
99
|
]
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
nexaai/_stub.cp313-win_arm64.pyd
CHANGED
|
Binary file
|
nexaai/_version.py
CHANGED
nexaai/binds/__init__.py
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
nexaai/binds/cpu_gpu/ggml.dll
CHANGED
|
Binary file
|
nexaai/binds/cpu_gpu/mtmd.dll
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
nexaai/binds/nexa_bridge.dll
CHANGED
|
Binary file
|
nexaai/binds/npu/ggml-base.dll
CHANGED
|
Binary file
|
nexaai/binds/npu/ggml-cpu.dll
CHANGED
|
Binary file
|
nexaai/binds/npu/ggml-opencl.dll
CHANGED
|
Binary file
|
nexaai/binds/npu/ggml.dll
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
nexaai/binds/npu/nexa_plugin.dll
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
nexaai/common.py
CHANGED
nexaai/diarize.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from typing import List, Optional, Sequence, Union
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from nexaai.base import BaseModel
|
|
6
|
+
from nexaai.common import PluginID, ModelConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class DiarizeConfig:
|
|
11
|
+
"""Configuration for speaker diarization."""
|
|
12
|
+
|
|
13
|
+
min_speakers: int = 0 # Minimum number of speakers (0 = auto-detect)
|
|
14
|
+
max_speakers: int = 0 # Maximum number of speakers (0 = no limit)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class SpeechSegment:
|
|
19
|
+
"""Speech segment with speaker label and timestamps."""
|
|
20
|
+
|
|
21
|
+
start_time: float # Segment start time in seconds
|
|
22
|
+
end_time: float # Segment end time in seconds
|
|
23
|
+
speaker_label: str # Speaker label (e.g., "SPEAKER_00")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class DiarizeResult:
|
|
28
|
+
"""Result from speaker diarization."""
|
|
29
|
+
|
|
30
|
+
segments: Sequence[SpeechSegment] # Array of speech segments
|
|
31
|
+
segment_count: int # Number of segments
|
|
32
|
+
num_speakers: int # Total unique speakers detected
|
|
33
|
+
duration: float # Total audio duration in seconds
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Diarize(BaseModel):
|
|
37
|
+
"""Abstract base class for speaker diarization models."""
|
|
38
|
+
|
|
39
|
+
def __init__(self, m_cfg: ModelConfig = ModelConfig()):
|
|
40
|
+
"""Initialize base Diarize class."""
|
|
41
|
+
self._m_cfg = m_cfg
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def _load_from(
|
|
45
|
+
cls,
|
|
46
|
+
model_path: str,
|
|
47
|
+
model_name: Optional[str] = None,
|
|
48
|
+
m_cfg: ModelConfig = ModelConfig(),
|
|
49
|
+
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
50
|
+
device_id: Optional[str] = None,
|
|
51
|
+
**kwargs
|
|
52
|
+
) -> "Diarize":
|
|
53
|
+
"""Load diarization model from local path using PyBind backend."""
|
|
54
|
+
from nexaai.diarize_impl.pybind_diarize_impl import PyBindDiarizeImpl
|
|
55
|
+
|
|
56
|
+
# There is no MLX implementation for diarization as of now.
|
|
57
|
+
return PyBindDiarizeImpl._load_from(
|
|
58
|
+
model_path, model_name, m_cfg, plugin_id, device_id
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def infer(
|
|
63
|
+
self,
|
|
64
|
+
audio_path: str,
|
|
65
|
+
config: Optional[DiarizeConfig] = None,
|
|
66
|
+
) -> DiarizeResult:
|
|
67
|
+
"""
|
|
68
|
+
Perform speaker diarization on audio file.
|
|
69
|
+
|
|
70
|
+
Determines "who spoke when" in the audio recording, producing time-stamped segments
|
|
71
|
+
with speaker labels. Segments are time-ordered and non-overlapping.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
audio_path: Path to audio file
|
|
75
|
+
config: Optional diarization configuration
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
DiarizeResult with segments, speaker count, and duration
|
|
79
|
+
"""
|
|
80
|
+
pass
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from typing import Any, Optional, Union
|
|
2
|
+
|
|
3
|
+
from nexaai.common import PluginID, ModelConfig
|
|
4
|
+
from nexaai.diarize import Diarize, DiarizeConfig, DiarizeResult, SpeechSegment
|
|
5
|
+
from nexaai.binds import diarize_bind, common_bind
|
|
6
|
+
from nexaai.runtime import _ensure_runtime
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PyBindDiarizeImpl(Diarize):
|
|
10
|
+
def __init__(self, handle: Any, m_cfg: ModelConfig = ModelConfig()):
|
|
11
|
+
"""Private constructor, should not be called directly."""
|
|
12
|
+
super().__init__(m_cfg)
|
|
13
|
+
self._handle = handle # This is a py::capsule
|
|
14
|
+
self._model_config = None
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def _load_from(
|
|
18
|
+
cls,
|
|
19
|
+
model_path: str,
|
|
20
|
+
model_name: Optional[str] = None,
|
|
21
|
+
m_cfg: ModelConfig = ModelConfig(),
|
|
22
|
+
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
23
|
+
device_id: Optional[str] = None,
|
|
24
|
+
) -> "PyBindDiarizeImpl":
|
|
25
|
+
"""Load diarization model from local path using PyBind backend."""
|
|
26
|
+
_ensure_runtime()
|
|
27
|
+
|
|
28
|
+
# Create model config
|
|
29
|
+
config = common_bind.ModelConfig()
|
|
30
|
+
|
|
31
|
+
config.n_ctx = m_cfg.n_ctx
|
|
32
|
+
if m_cfg.n_threads is not None:
|
|
33
|
+
config.n_threads = m_cfg.n_threads
|
|
34
|
+
if m_cfg.n_threads_batch is not None:
|
|
35
|
+
config.n_threads_batch = m_cfg.n_threads_batch
|
|
36
|
+
if m_cfg.n_batch is not None:
|
|
37
|
+
config.n_batch = m_cfg.n_batch
|
|
38
|
+
if m_cfg.n_ubatch is not None:
|
|
39
|
+
config.n_ubatch = m_cfg.n_ubatch
|
|
40
|
+
if m_cfg.n_seq_max is not None:
|
|
41
|
+
config.n_seq_max = m_cfg.n_seq_max
|
|
42
|
+
config.n_gpu_layers = m_cfg.n_gpu_layers
|
|
43
|
+
|
|
44
|
+
# handle chat template strings (if needed for diarization)
|
|
45
|
+
if m_cfg.chat_template_path:
|
|
46
|
+
config.chat_template_path = m_cfg.chat_template_path
|
|
47
|
+
|
|
48
|
+
if m_cfg.chat_template_content:
|
|
49
|
+
config.chat_template_content = m_cfg.chat_template_content
|
|
50
|
+
|
|
51
|
+
# Convert plugin_id to string
|
|
52
|
+
plugin_id_str = (
|
|
53
|
+
plugin_id.value if isinstance(plugin_id, PluginID) else str(plugin_id)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Create Diarize handle using the binding
|
|
57
|
+
handle = diarize_bind.ml_diarize_create(
|
|
58
|
+
model_path=model_path,
|
|
59
|
+
model_name=model_name,
|
|
60
|
+
model_config=config,
|
|
61
|
+
plugin_id=plugin_id_str,
|
|
62
|
+
device_id=device_id,
|
|
63
|
+
license_id=None, # Optional
|
|
64
|
+
license_key=None, # Optional
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return cls(handle, m_cfg)
|
|
68
|
+
|
|
69
|
+
def eject(self):
|
|
70
|
+
"""Release the model from memory."""
|
|
71
|
+
# py::capsule handles cleanup automatically
|
|
72
|
+
if hasattr(self, "_handle") and self._handle is not None:
|
|
73
|
+
del self._handle
|
|
74
|
+
self._handle = None
|
|
75
|
+
|
|
76
|
+
def infer(
|
|
77
|
+
self,
|
|
78
|
+
audio_path: str,
|
|
79
|
+
config: Optional[DiarizeConfig] = None,
|
|
80
|
+
) -> DiarizeResult:
|
|
81
|
+
"""
|
|
82
|
+
Perform speaker diarization on audio file.
|
|
83
|
+
|
|
84
|
+
Determines "who spoke when" in the audio recording, producing time-stamped segments
|
|
85
|
+
with speaker labels. Segments are time-ordered and non-overlapping.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
audio_path: Path to audio file
|
|
89
|
+
config: Optional diarization configuration
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
DiarizeResult with segments, speaker count, and duration
|
|
93
|
+
"""
|
|
94
|
+
if self._handle is None:
|
|
95
|
+
raise RuntimeError("Diarization model not loaded. Call _load_from first.")
|
|
96
|
+
|
|
97
|
+
# Convert DiarizeConfig to binding format if provided
|
|
98
|
+
diarize_config = None
|
|
99
|
+
if config:
|
|
100
|
+
diarize_config = diarize_bind.DiarizeConfig()
|
|
101
|
+
diarize_config.min_speakers = config.min_speakers
|
|
102
|
+
diarize_config.max_speakers = config.max_speakers
|
|
103
|
+
|
|
104
|
+
# Perform diarization using the binding
|
|
105
|
+
result_dict = diarize_bind.ml_diarize_infer(
|
|
106
|
+
handle=self._handle, audio_path=audio_path, config=diarize_config
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Convert result to DiarizeResult
|
|
110
|
+
segments = []
|
|
111
|
+
for segment_dict in result_dict.get("segments", []):
|
|
112
|
+
segments.append(
|
|
113
|
+
SpeechSegment(
|
|
114
|
+
start_time=float(segment_dict["start_time"]),
|
|
115
|
+
end_time=float(segment_dict["end_time"]),
|
|
116
|
+
speaker_label=segment_dict["speaker_label"],
|
|
117
|
+
)
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return DiarizeResult(
|
|
121
|
+
segments=segments,
|
|
122
|
+
segment_count=result_dict.get("segment_count", 0),
|
|
123
|
+
num_speakers=result_dict.get("num_speakers", 0),
|
|
124
|
+
duration=result_dict.get("duration", 0.0),
|
|
125
|
+
)
|
|
@@ -17,14 +17,15 @@ class PyBindLLMImpl(LLM):
|
|
|
17
17
|
self._profiling_data = None
|
|
18
18
|
|
|
19
19
|
@classmethod
|
|
20
|
-
def _load_from(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
def _load_from(
|
|
21
|
+
cls,
|
|
22
|
+
local_path: str,
|
|
23
|
+
model_name: Optional[str] = None,
|
|
24
|
+
tokenizer_path: Optional[str] = None,
|
|
25
|
+
m_cfg: ModelConfig = ModelConfig(),
|
|
26
|
+
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
27
|
+
device_id: Optional[str] = None,
|
|
28
|
+
) -> "PyBindLLMImpl":
|
|
28
29
|
"""Load model from local path."""
|
|
29
30
|
_ensure_runtime()
|
|
30
31
|
|
|
@@ -51,16 +52,22 @@ class PyBindLLMImpl(LLM):
|
|
|
51
52
|
if m_cfg.chat_template_content:
|
|
52
53
|
config.chat_template_content = m_cfg.chat_template_content
|
|
53
54
|
|
|
55
|
+
# handle system prompt (required for NPU plugin)
|
|
56
|
+
if m_cfg.system_prompt:
|
|
57
|
+
config.system_prompt = m_cfg.system_prompt
|
|
58
|
+
|
|
54
59
|
# Create handle : returns py::capsule with automatic cleanup
|
|
55
60
|
# Convert enum to string for C++ binding
|
|
56
|
-
plugin_id_str =
|
|
61
|
+
plugin_id_str = (
|
|
62
|
+
plugin_id.value if isinstance(plugin_id, PluginID) else plugin_id
|
|
63
|
+
)
|
|
57
64
|
handle = llm_bind.ml_llm_create(
|
|
58
65
|
model_path=local_path,
|
|
59
66
|
model_name=model_name,
|
|
60
67
|
tokenizer_path=tokenizer_path,
|
|
61
68
|
model_config=config,
|
|
62
69
|
plugin_id=plugin_id_str,
|
|
63
|
-
device_id=device_id
|
|
70
|
+
device_id=device_id,
|
|
64
71
|
)
|
|
65
72
|
return cls(handle, m_cfg)
|
|
66
73
|
|
|
@@ -70,16 +77,23 @@ class PyBindLLMImpl(LLM):
|
|
|
70
77
|
del self._handle
|
|
71
78
|
self._handle = None
|
|
72
79
|
|
|
73
|
-
def apply_chat_template(
|
|
80
|
+
def apply_chat_template(
|
|
81
|
+
self,
|
|
82
|
+
messages: list[ChatMessage],
|
|
83
|
+
tools: Optional[str] = None,
|
|
84
|
+
enable_thinking: bool = True,
|
|
85
|
+
add_generation_prompt: bool = True,
|
|
86
|
+
) -> str:
|
|
74
87
|
"""Apply the chat template to messages."""
|
|
75
88
|
# Convert TypedDict to list of dicts for binding
|
|
76
|
-
message_dicts = [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return llm_bind.ml_llm_apply_chat_template(self._handle, message_dicts, tools, enable_thinking)
|
|
89
|
+
message_dicts = [{"role": m["role"], "content": m["content"]} for m in messages]
|
|
90
|
+
return llm_bind.ml_llm_apply_chat_template(
|
|
91
|
+
self._handle, message_dicts, tools, enable_thinking
|
|
92
|
+
)
|
|
81
93
|
|
|
82
|
-
def generate_stream(
|
|
94
|
+
def generate_stream(
|
|
95
|
+
self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()
|
|
96
|
+
) -> Generator[str, None, None]:
|
|
83
97
|
"""Generate text with streaming."""
|
|
84
98
|
token_queue = queue.Queue()
|
|
85
99
|
exception_container = [None]
|
|
@@ -87,10 +101,10 @@ class PyBindLLMImpl(LLM):
|
|
|
87
101
|
|
|
88
102
|
def on_token(token: str, user_data) -> bool:
|
|
89
103
|
if self._cancel_event.is_set():
|
|
90
|
-
token_queue.put((
|
|
104
|
+
token_queue.put(("end", None))
|
|
91
105
|
return False # Stop generation
|
|
92
106
|
try:
|
|
93
|
-
token_queue.put((
|
|
107
|
+
token_queue.put(("token", token))
|
|
94
108
|
return True # Continue generation
|
|
95
109
|
except Exception as e:
|
|
96
110
|
exception_container[0] = e
|
|
@@ -106,13 +120,15 @@ class PyBindLLMImpl(LLM):
|
|
|
106
120
|
prompt=prompt,
|
|
107
121
|
config=config,
|
|
108
122
|
on_token=on_token,
|
|
109
|
-
user_data=None
|
|
123
|
+
user_data=None,
|
|
124
|
+
)
|
|
125
|
+
self._profiling_data = ProfilingData.from_dict(
|
|
126
|
+
result.get("profile_data", {})
|
|
110
127
|
)
|
|
111
|
-
self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
|
|
112
128
|
except Exception as e:
|
|
113
129
|
exception_container[0] = e
|
|
114
130
|
finally:
|
|
115
|
-
token_queue.put((
|
|
131
|
+
token_queue.put(("end", None))
|
|
116
132
|
|
|
117
133
|
thread = threading.Thread(target=generate)
|
|
118
134
|
thread.start()
|
|
@@ -121,9 +137,9 @@ class PyBindLLMImpl(LLM):
|
|
|
121
137
|
try:
|
|
122
138
|
while True:
|
|
123
139
|
msg_type, token = token_queue.get()
|
|
124
|
-
if msg_type ==
|
|
140
|
+
if msg_type == "token":
|
|
125
141
|
yield token
|
|
126
|
-
elif msg_type in (
|
|
142
|
+
elif msg_type in ("error", "end"):
|
|
127
143
|
break
|
|
128
144
|
finally:
|
|
129
145
|
thread.join()
|
|
@@ -131,7 +147,9 @@ class PyBindLLMImpl(LLM):
|
|
|
131
147
|
if exception_container[0]:
|
|
132
148
|
raise exception_container[0]
|
|
133
149
|
|
|
134
|
-
def generate(
|
|
150
|
+
def generate(
|
|
151
|
+
self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()
|
|
152
|
+
) -> str:
|
|
135
153
|
"""
|
|
136
154
|
Generate text without streaming.
|
|
137
155
|
|
|
@@ -148,7 +166,7 @@ class PyBindLLMImpl(LLM):
|
|
|
148
166
|
prompt=prompt,
|
|
149
167
|
config=config,
|
|
150
168
|
on_token=None, # No callback for non-streaming
|
|
151
|
-
user_data=None
|
|
169
|
+
user_data=None,
|
|
152
170
|
)
|
|
153
171
|
|
|
154
172
|
self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
|
|
@@ -23,23 +23,24 @@ class PyBindVLMImpl(VLM):
|
|
|
23
23
|
self._profiling_data = None
|
|
24
24
|
|
|
25
25
|
@classmethod
|
|
26
|
-
def _load_from(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
def _load_from(
|
|
27
|
+
cls,
|
|
28
|
+
local_path: str,
|
|
29
|
+
mmproj_path: str = None,
|
|
30
|
+
model_name: Optional[str] = None,
|
|
31
|
+
m_cfg: ModelConfig = ModelConfig(),
|
|
32
|
+
plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
|
|
33
|
+
device_id: Optional[str] = None,
|
|
34
|
+
) -> "PyBindVLMImpl":
|
|
34
35
|
"""Load VLM model from local path.
|
|
35
|
-
|
|
36
|
+
|
|
36
37
|
Args:
|
|
37
38
|
local_path: Path to the main model file
|
|
38
39
|
mmproj_path: Path to the multimodal projection file
|
|
39
40
|
m_cfg: Model configuration
|
|
40
41
|
plugin_id: Plugin identifier
|
|
41
42
|
device_id: Optional device ID (not used in current binding)
|
|
42
|
-
|
|
43
|
+
|
|
43
44
|
Returns:
|
|
44
45
|
PyBindVLMImpl instance
|
|
45
46
|
"""
|
|
@@ -67,16 +68,22 @@ class PyBindVLMImpl(VLM):
|
|
|
67
68
|
if m_cfg.chat_template_content:
|
|
68
69
|
config.chat_template_content = m_cfg.chat_template_content
|
|
69
70
|
|
|
71
|
+
# handle system prompt (required for NPU plugin)
|
|
72
|
+
if m_cfg.system_prompt:
|
|
73
|
+
config.system_prompt = m_cfg.system_prompt
|
|
74
|
+
|
|
70
75
|
# Create handle : returns py::capsule with automatic cleanup
|
|
71
76
|
# Convert enum to string for C++ binding
|
|
72
|
-
plugin_id_str =
|
|
77
|
+
plugin_id_str = (
|
|
78
|
+
plugin_id.value if isinstance(plugin_id, PluginID) else plugin_id
|
|
79
|
+
)
|
|
73
80
|
handle = vlm_bind.create_vlm(
|
|
74
81
|
model_path=local_path,
|
|
75
82
|
mmproj_path=mmproj_path,
|
|
76
83
|
model_name=model_name,
|
|
77
84
|
model_config=config,
|
|
78
85
|
plugin_id=plugin_id_str,
|
|
79
|
-
device_id=device_id
|
|
86
|
+
device_id=device_id,
|
|
80
87
|
)
|
|
81
88
|
return cls(handle, m_cfg)
|
|
82
89
|
|
|
@@ -97,18 +104,18 @@ class PyBindVLMImpl(VLM):
|
|
|
97
104
|
self,
|
|
98
105
|
messages: List[MultiModalMessage],
|
|
99
106
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
100
|
-
enable_thinking: bool = True
|
|
107
|
+
enable_thinking: bool = True,
|
|
101
108
|
) -> str:
|
|
102
109
|
"""Apply the chat template to multimodal messages."""
|
|
103
110
|
payload = []
|
|
104
111
|
for msg in messages:
|
|
105
|
-
role
|
|
112
|
+
role = msg["role"]
|
|
106
113
|
blocks = []
|
|
107
114
|
|
|
108
115
|
for c in msg["content"]:
|
|
109
116
|
t = c["type"]
|
|
110
117
|
if t == "text":
|
|
111
|
-
blocks.append({"type": "text", "text": c.get("text","") or ""})
|
|
118
|
+
blocks.append({"type": "text", "text": c.get("text", "") or ""})
|
|
112
119
|
else:
|
|
113
120
|
# Pass through the original structure for image, audio, and any other types
|
|
114
121
|
# Let vlm-bind.cpp handle field extraction (text/url/path)
|
|
@@ -116,10 +123,14 @@ class PyBindVLMImpl(VLM):
|
|
|
116
123
|
|
|
117
124
|
payload.append({"role": role, "content": blocks})
|
|
118
125
|
|
|
119
|
-
result = vlm_bind.ml_vlm_apply_chat_template(
|
|
126
|
+
result = vlm_bind.ml_vlm_apply_chat_template(
|
|
127
|
+
self._handle, payload, tools, enable_thinking
|
|
128
|
+
)
|
|
120
129
|
return result
|
|
121
130
|
|
|
122
|
-
def generate_stream(
|
|
131
|
+
def generate_stream(
|
|
132
|
+
self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()
|
|
133
|
+
) -> Generator[str, None, None]:
|
|
123
134
|
"""Generate text with streaming."""
|
|
124
135
|
token_queue = queue.Queue()
|
|
125
136
|
exception_container = [None]
|
|
@@ -127,10 +138,10 @@ class PyBindVLMImpl(VLM):
|
|
|
127
138
|
|
|
128
139
|
def on_token(token: str, user_data) -> bool:
|
|
129
140
|
if self._cancel_event.is_set():
|
|
130
|
-
token_queue.put((
|
|
141
|
+
token_queue.put(("end", None))
|
|
131
142
|
return False # Stop generation
|
|
132
143
|
try:
|
|
133
|
-
token_queue.put((
|
|
144
|
+
token_queue.put(("token", token))
|
|
134
145
|
return True # Continue generation
|
|
135
146
|
except Exception as e:
|
|
136
147
|
exception_container[0] = e
|
|
@@ -146,25 +157,31 @@ class PyBindVLMImpl(VLM):
|
|
|
146
157
|
prompt=prompt,
|
|
147
158
|
config=config,
|
|
148
159
|
on_token=on_token,
|
|
149
|
-
user_data=None
|
|
160
|
+
user_data=None,
|
|
150
161
|
)
|
|
151
|
-
|
|
162
|
+
|
|
152
163
|
# Check for errors in result
|
|
153
164
|
error_code = result.get("error_code", ML_SUCCESS)
|
|
154
165
|
if error_code != ML_SUCCESS:
|
|
155
166
|
error_message = result.get("error_message", "Unknown error")
|
|
156
167
|
if error_code == ML_ERROR_LLM_TOKENIZATION_CONTEXT_LENGTH:
|
|
157
|
-
exception_container[0] = ContextLengthExceededError(
|
|
168
|
+
exception_container[0] = ContextLengthExceededError(
|
|
169
|
+
error_message, error_code
|
|
170
|
+
)
|
|
158
171
|
else:
|
|
159
|
-
exception_container[0] = GenerationError(
|
|
160
|
-
|
|
172
|
+
exception_container[0] = GenerationError(
|
|
173
|
+
error_message, error_code
|
|
174
|
+
)
|
|
175
|
+
token_queue.put(("end", None))
|
|
161
176
|
return
|
|
162
|
-
|
|
163
|
-
self._profiling_data = ProfilingData.from_dict(
|
|
177
|
+
|
|
178
|
+
self._profiling_data = ProfilingData.from_dict(
|
|
179
|
+
result.get("profile_data", {})
|
|
180
|
+
)
|
|
164
181
|
except Exception as e:
|
|
165
182
|
exception_container[0] = e
|
|
166
183
|
finally:
|
|
167
|
-
token_queue.put((
|
|
184
|
+
token_queue.put(("end", None))
|
|
168
185
|
|
|
169
186
|
thread = threading.Thread(target=generate)
|
|
170
187
|
thread.start()
|
|
@@ -173,9 +190,9 @@ class PyBindVLMImpl(VLM):
|
|
|
173
190
|
try:
|
|
174
191
|
while True:
|
|
175
192
|
msg_type, token = token_queue.get()
|
|
176
|
-
if msg_type ==
|
|
193
|
+
if msg_type == "token":
|
|
177
194
|
yield token
|
|
178
|
-
elif msg_type in (
|
|
195
|
+
elif msg_type in ("error", "end"):
|
|
179
196
|
break
|
|
180
197
|
finally:
|
|
181
198
|
thread.join()
|
|
@@ -183,7 +200,9 @@ class PyBindVLMImpl(VLM):
|
|
|
183
200
|
if exception_container[0]:
|
|
184
201
|
raise exception_container[0]
|
|
185
202
|
|
|
186
|
-
def generate(
|
|
203
|
+
def generate(
|
|
204
|
+
self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()
|
|
205
|
+
) -> str:
|
|
187
206
|
"""
|
|
188
207
|
Generate text without streaming.
|
|
189
208
|
|
|
@@ -200,7 +219,7 @@ class PyBindVLMImpl(VLM):
|
|
|
200
219
|
prompt=prompt,
|
|
201
220
|
config=config,
|
|
202
221
|
on_token=None, # No callback for non-streaming
|
|
203
|
-
user_data=None
|
|
222
|
+
user_data=None,
|
|
204
223
|
)
|
|
205
224
|
|
|
206
225
|
# Check for errors in result
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
nexaai/__init__.py,sha256=
|
|
2
|
-
nexaai/_stub.cp313-win_arm64.pyd,sha256=
|
|
3
|
-
nexaai/_version.py,sha256=
|
|
1
|
+
nexaai/__init__.py,sha256=S6GrUD-_rZhDY2tcIY4aJvNIZa6KOk6TfV26Jb6x0pE,2582
|
|
2
|
+
nexaai/_stub.cp313-win_arm64.pyd,sha256=s04H3HEwpabF09TmfNFTdN8-CW_yZSyE3_AhkqqrU38,10240
|
|
3
|
+
nexaai/_version.py,sha256=OKw2jr_ECtbEM3MNGRIR8lheCGGhID-ysEdmnHkH_pA,143
|
|
4
4
|
nexaai/asr.py,sha256=wqtq71cxIMGE4KvOIYZebHdWik8dy4LyKrDI98PDvzQ,2294
|
|
5
5
|
nexaai/base.py,sha256=N8PRgDFA-XPku2vWnQIofQ7ipz3pPlO6f8YZGnuhquE,982
|
|
6
|
-
nexaai/common.py,sha256=
|
|
6
|
+
nexaai/common.py,sha256=LuOMGtDp_HQa4cpW84Cezqc3cYBgFySi4qYlEQsL9J4,3558
|
|
7
7
|
nexaai/cv.py,sha256=WbyFzvByx6hOoR2ZrGSm6i4uG0ubxqeMZ9x71kG6Des,3338
|
|
8
|
+
nexaai/diarize.py,sha256=WmwHr6VfN1SbRX45KdSvFS44t8Ca9R8R1WkudKswDC0,2461
|
|
8
9
|
nexaai/embedder.py,sha256=lXOT16PEvd_hT23d77dZH38VHNOAk-3JvoOUdQTEaGI,2552
|
|
9
10
|
nexaai/image_gen.py,sha256=MkGw1HXqqv8cJzbiGERNPKFXfq9vMOlvuq0pgekXw68,4385
|
|
10
11
|
nexaai/llm.py,sha256=-agVJuj0FOaDvDiT-fFSOpoyVt-MpNudBucsod3Vp1M,3673
|
|
@@ -17,35 +18,36 @@ nexaai/vlm.py,sha256=LUrd1_SGHOsYpWyUymX93oEIsNJv7XzHIHo4hBZOhQA,4800
|
|
|
17
18
|
nexaai/asr_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
19
|
nexaai/asr_impl/mlx_asr_impl.py,sha256=eosd8-TIWAOwV0HltmoFrLwzXHcU4jyxtncvuZE9pgA,3257
|
|
19
20
|
nexaai/asr_impl/pybind_asr_impl.py,sha256=FLOWIph37q_nIiNx8xYi-VnhQ6CrPuc4HFAJZQKc42w,4680
|
|
20
|
-
nexaai/binds/__init__.py,sha256
|
|
21
|
-
nexaai/binds/asr_bind.cp313-win_arm64.pyd,sha256=
|
|
22
|
-
nexaai/binds/common_bind.cp313-win_arm64.pyd,sha256=
|
|
23
|
-
nexaai/binds/cv_bind.cp313-win_arm64.pyd,sha256=
|
|
24
|
-
nexaai/binds/
|
|
21
|
+
nexaai/binds/__init__.py,sha256=-dSUMEA_-SghPgdI0qE2RWF2Fng_Klu2rGpP5zqA8_o,183
|
|
22
|
+
nexaai/binds/asr_bind.cp313-win_arm64.pyd,sha256=X8-9Ro_-7g_wrCpZylgkTyaBu_R8suIgcUihPRfYvn8,267776
|
|
23
|
+
nexaai/binds/common_bind.cp313-win_arm64.pyd,sha256=_7ZnfjzG7XG5-TMMtUiteY4OrHZ7kKu3H8v5nxkVdIk,293888
|
|
24
|
+
nexaai/binds/cv_bind.cp313-win_arm64.pyd,sha256=QE8WAbLZKxPIPOonaLM2OaWdMhwZgjlvLKExVcIB3tw,328192
|
|
25
|
+
nexaai/binds/diarize_bind.cp313-win_arm64.pyd,sha256=ZjXL6i6pGhcHCqx5w9FCJAYpg_Q7WGo0NMrfr1Dtllw,232448
|
|
26
|
+
nexaai/binds/embedder_bind.cp313-win_arm64.pyd,sha256=SEkNn8kVLRODVlb-3j4DI2l7fuK9hEmDHEbOHyKPEfQ,243712
|
|
25
27
|
nexaai/binds/libcrypto-3-arm64.dll,sha256=jl9ZGYpUKEfkqU2HosjSJQ4Mg0tQdkEka7mKI371NcQ,7297536
|
|
26
28
|
nexaai/binds/libssl-3-arm64.dll,sha256=GeAhDqjiuxhc792cpJIzjEx03noAWUM6R3w2ekHKnJw,1722368
|
|
27
|
-
nexaai/binds/llm_bind.cp313-win_arm64.pyd,sha256=
|
|
28
|
-
nexaai/binds/nexa_bridge.dll,sha256=
|
|
29
|
-
nexaai/binds/rerank_bind.cp313-win_arm64.pyd,sha256=
|
|
30
|
-
nexaai/binds/vlm_bind.cp313-win_arm64.pyd,sha256=
|
|
31
|
-
nexaai/binds/cpu_gpu/ggml-base.dll,sha256=
|
|
32
|
-
nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=
|
|
33
|
-
nexaai/binds/cpu_gpu/ggml-opencl.dll,sha256=
|
|
34
|
-
nexaai/binds/cpu_gpu/ggml.dll,sha256=
|
|
29
|
+
nexaai/binds/llm_bind.cp313-win_arm64.pyd,sha256=jqbpyuJfJTiYHmlKpHt7Ofg5yWo4hdjs9_48RjcWjG0,226304
|
|
30
|
+
nexaai/binds/nexa_bridge.dll,sha256=_7VuTbWqKV-tI2dpBcW1QnutbmavubywSSMm12jIHsA,231936
|
|
31
|
+
nexaai/binds/rerank_bind.cp313-win_arm64.pyd,sha256=JG_K6fwSDcqx9WHnpLDcM2RbcddLR903UAnoDAfRTGo,239616
|
|
32
|
+
nexaai/binds/vlm_bind.cp313-win_arm64.pyd,sha256=4K8imx11I_CHQY5Qwfkc-uLKvx0jma2J3zfCbB0TTow,237568
|
|
33
|
+
nexaai/binds/cpu_gpu/ggml-base.dll,sha256=B6tz8_Gj5bE8LaDOlv4g8ggS3zE02rifrcVdL-NaSKQ,534016
|
|
34
|
+
nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=I8MuXSSYaVirOaDCcuylzcrVMdeDIlMenkaRlz9V9XM,555520
|
|
35
|
+
nexaai/binds/cpu_gpu/ggml-opencl.dll,sha256=Iwj6PCJhLolKkNWUDmCigYIgzL5cfN8HiqU5F8rX0lI,620544
|
|
36
|
+
nexaai/binds/cpu_gpu/ggml.dll,sha256=I3iEGHmXbFIVzeBoIfdPgmo6lFWcKC8MsnTtBpVDdac,70656
|
|
35
37
|
nexaai/binds/cpu_gpu/libomp140.aarch64.dll,sha256=0mSWmPxoRm7ojPWK46sPqxBvKTJug6qqVkPTBlGpYuM,599504
|
|
36
|
-
nexaai/binds/cpu_gpu/mtmd.dll,sha256=
|
|
37
|
-
nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=
|
|
38
|
-
nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256
|
|
38
|
+
nexaai/binds/cpu_gpu/mtmd.dll,sha256=gEAKzury4q1Y32C0ZUGJENqiahPypkV4n3N4chiw8GQ,551936
|
|
39
|
+
nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=8jKFNoAjW6art7Cxxp11-dqgJFine_nGuF36RrB7ZJc,1581056
|
|
40
|
+
nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256=-LBW7eP3hPqoGGUldfxOAQU363-I0Gwjfip4U4WKnac,2177024
|
|
39
41
|
nexaai/binds/npu/FLAC.dll,sha256=KieFm07q-TkzZ-NoOzaLutkwlMoYNnMD3IuI1iMAt9s,224256
|
|
40
42
|
nexaai/binds/npu/convnext-sdk.dll,sha256=90dv6IKyGUnsW61V8byEVxn9sOkRT_bAoOjVr2QE7rU,1210368
|
|
41
43
|
nexaai/binds/npu/embed-gemma-sdk.dll,sha256=SIOpKs_9_XxvoflWR6KQtkUqwYa-fZt4wtPxIoifXJ8,4683264
|
|
42
44
|
nexaai/binds/npu/fftw3.dll,sha256=UHNc9Fdpo50qWP6jOIVftyGJeoFbExBV4taNrI-rcG8,569856
|
|
43
45
|
nexaai/binds/npu/fftw3f.dll,sha256=Qeeq1HxRdRReCBihEpEBz4AfcPrJZ994u1hy4OwSv5M,565760
|
|
44
|
-
nexaai/binds/npu/ggml-base.dll,sha256=
|
|
45
|
-
nexaai/binds/npu/ggml-cpu.dll,sha256=
|
|
46
|
-
nexaai/binds/npu/ggml-opencl.dll,sha256=
|
|
47
|
-
nexaai/binds/npu/ggml.dll,sha256=
|
|
48
|
-
nexaai/binds/npu/granite-nano-sdk.dll,sha256=
|
|
46
|
+
nexaai/binds/npu/ggml-base.dll,sha256=B6tz8_Gj5bE8LaDOlv4g8ggS3zE02rifrcVdL-NaSKQ,534016
|
|
47
|
+
nexaai/binds/npu/ggml-cpu.dll,sha256=I8MuXSSYaVirOaDCcuylzcrVMdeDIlMenkaRlz9V9XM,555520
|
|
48
|
+
nexaai/binds/npu/ggml-opencl.dll,sha256=Iwj6PCJhLolKkNWUDmCigYIgzL5cfN8HiqU5F8rX0lI,620544
|
|
49
|
+
nexaai/binds/npu/ggml.dll,sha256=I3iEGHmXbFIVzeBoIfdPgmo6lFWcKC8MsnTtBpVDdac,70656
|
|
50
|
+
nexaai/binds/npu/granite-nano-sdk.dll,sha256=gFON6w2dppuYc-T1zCz3Rqdyy8FkHDCpVTzYPKRC3HM,4841984
|
|
49
51
|
nexaai/binds/npu/granite4-sdk.dll,sha256=aNlT_Db8CYO4-A6gegxINhU9VbiGAXkArenruym4Jvs,4735488
|
|
50
52
|
nexaai/binds/npu/jina-rerank-sdk.dll,sha256=End5A_pSnaswcjsmifuXkc41zZdl8c1HtA69lqjUFaM,4632576
|
|
51
53
|
nexaai/binds/npu/libcrypto-3-arm64.dll,sha256=Zdx-VmPlmvRbagtlOdhjOsmZSGTcRoUCm_K-_6XcDe8,7309432
|
|
@@ -55,9 +57,9 @@ nexaai/binds/npu/libssl-3-arm64.dll,sha256=YbBpztXYi15lGe445EyV9DL0Q4rI0k23gta1d
|
|
|
55
57
|
nexaai/binds/npu/liquid-sdk.dll,sha256=la2-wwueKuq8gzNtb-PVbfXUXB7TkG04HFrPKrxwg9k,4849664
|
|
56
58
|
nexaai/binds/npu/llama3-3b-sdk.dll,sha256=C9SS6tYpll8yAb_xBqBkmweuVTk2aA-9sPE6DPlBl4Y,4738048
|
|
57
59
|
nexaai/binds/npu/mpg123.dll,sha256=1iTmvrgIVievsDXO1RaWLntnE-TIAVPpbqEV8C-yaC0,253952
|
|
58
|
-
nexaai/binds/npu/nexa-mm-process.dll,sha256=
|
|
60
|
+
nexaai/binds/npu/nexa-mm-process.dll,sha256=w4azeu0O7XiTGS26Lz9snzHCLNrfFf6_I2y5hxZVHwE,5465600
|
|
59
61
|
nexaai/binds/npu/nexa-sampling.dll,sha256=eYclqTHNOGn8bEzS2yarCULnh1PwXsPgQO8ePGeZKx8,3795968
|
|
60
|
-
nexaai/binds/npu/nexa_plugin.dll,sha256
|
|
62
|
+
nexaai/binds/npu/nexa_plugin.dll,sha256=0HvsfaF7rHomJh5bFScDPFieSBibrqHmf8knkw9VpA0,773632
|
|
61
63
|
nexaai/binds/npu/nexaproc.dll,sha256=uWp5ENzDwlavO06t4SfcKBnc7JlF1OmAGsJCrV39TCw,2561024
|
|
62
64
|
nexaai/binds/npu/ogg.dll,sha256=bgpqQM-OLactFaqZYmZcIDjkaTRCinrny8_6SBUU8B0,30720
|
|
63
65
|
nexaai/binds/npu/omni-neural-sdk.dll,sha256=jA8XFNirsiK5uAZbnoU01RohWj33Bf2uv8Y8g8GySDQ,5257728
|
|
@@ -68,7 +70,7 @@ nexaai/binds/npu/paddleocr-sdk.dll,sha256=dJer3VBQRbUIqRDe8DjpTFVjOm18h9IJQYjozn
|
|
|
68
70
|
nexaai/binds/npu/parakeet-sdk.dll,sha256=REkIVi5YLasAOiDql2J60ipQJjT0_GcRpzGi5JsyNZs,1732608
|
|
69
71
|
nexaai/binds/npu/phi3-5-sdk.dll,sha256=__Q5BgnYarK9yWBrRDO-UKvFQq9gfFVF5JQCThrJl6A,4737024
|
|
70
72
|
nexaai/binds/npu/phi4-sdk.dll,sha256=uBJL70m0qOAAlV_hEGi-tB753A2dGFSpD8JsxTDW3HA,4737536
|
|
71
|
-
nexaai/binds/npu/pyannote-sdk.dll,sha256=
|
|
73
|
+
nexaai/binds/npu/pyannote-sdk.dll,sha256=VPAI9Pj29FOjL77u3ZL8bv0cTVNXXf2Wq3IijfpypeA,1195520
|
|
72
74
|
nexaai/binds/npu/qwen3-4b-sdk.dll,sha256=94FRAX6LrXGsp0BgwRR2TS7MCwUD-dbqVxbUeIzNGPo,4730368
|
|
73
75
|
nexaai/binds/npu/qwen3vl-sdk.dll,sha256=pmI701PrrYAj3J0nJsEa9zmSR5iqsmDuLrstanshrm8,5152256
|
|
74
76
|
nexaai/binds/npu/qwen3vl-vision.dll,sha256=kCJBlpWv_4YQCgCIL4b99a6eFd9Ok3_V8TWB_X77w5A,546816
|
|
@@ -125,6 +127,8 @@ nexaai/binds/npu/htp-files/libsnpehtpv73.cat,sha256=hNtz9-i_cZjR5xLVEI_56jjD8pQr
|
|
|
125
127
|
nexaai/cv_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
128
|
nexaai/cv_impl/mlx_cv_impl.py,sha256=gKECQOv8iaWwG3bl7xeqVy2NN_9K7tYerIFzfn4eLo4,3228
|
|
127
129
|
nexaai/cv_impl/pybind_cv_impl.py,sha256=YVIgNZe8FaUs6eH4IfirqhAyMy9RXqZL0eqVjGwSfO0,4761
|
|
130
|
+
nexaai/diarize_impl/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
131
|
+
nexaai/diarize_impl/pybind_diarize_impl.py,sha256=SgdfY_BC0lXF4Ard73ZwsHFALX03DRjEj2DNWYJuPc0,4482
|
|
128
132
|
nexaai/embedder_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
133
|
nexaai/embedder_impl/mlx_embedder_impl.py,sha256=pFPraUAjm9EVvVbwIp1cjbtXUysF5pqxEcK2CAFvcDw,4639
|
|
130
134
|
nexaai/embedder_impl/pybind_embedder_impl.py,sha256=lFpf0wI2d7kfO2GUyUuUS1U2L_PyZMJVGmAvF8EuQ0g,3653
|
|
@@ -133,7 +137,7 @@ nexaai/image_gen_impl/mlx_image_gen_impl.py,sha256=BuDkksvXyb4J02GsdnbGAmYckfUU0
|
|
|
133
137
|
nexaai/image_gen_impl/pybind_image_gen_impl.py,sha256=ms34VYoD5AxZFG6cIG0QAJDjCtfphaZ1bHzKzey1xF8,3692
|
|
134
138
|
nexaai/llm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
135
139
|
nexaai/llm_impl/mlx_llm_impl.py,sha256=dPtaEribluHZZY_f9M114glcQhtDEckukw4Sfd5zJos,11296
|
|
136
|
-
nexaai/llm_impl/pybind_llm_impl.py,sha256
|
|
140
|
+
nexaai/llm_impl/pybind_llm_impl.py,sha256=0ZNFA5xnNGqzmWcO_Fg-Nhv-fE8YVLjrLFPCDc499r0,8376
|
|
137
141
|
nexaai/rerank_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
142
|
nexaai/rerank_impl/mlx_rerank_impl.py,sha256=3nbqCdzyAugc4P_6K9mowEgy4LFdfzhy7GUvn9GMpSE,3377
|
|
139
143
|
nexaai/rerank_impl/pybind_rerank_impl.py,sha256=tmzrpRYCCV3ATxbE9G1Io6SUtgYPO8BFe48nTae6_xw,4490
|
|
@@ -148,8 +152,8 @@ nexaai/utils/progress_tracker.py,sha256=jdUqtmPqyhwC9uSKvQcJEYETwSt-OhP4oitdJ946
|
|
|
148
152
|
nexaai/utils/quantization_utils.py,sha256=FYcNSAKGlBqFDUTx3jSKOr2lnq4nyiyC0ZG8oSxFwiU,7825
|
|
149
153
|
nexaai/vlm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
150
154
|
nexaai/vlm_impl/mlx_vlm_impl.py,sha256=sgHqnX5OCSGLccCnTuRiktIbqThNn3AAIvYE2_Dy4TI,10833
|
|
151
|
-
nexaai/vlm_impl/pybind_vlm_impl.py,sha256=
|
|
152
|
-
nexaai-1.0.
|
|
153
|
-
nexaai-1.0.
|
|
154
|
-
nexaai-1.0.
|
|
155
|
-
nexaai-1.0.
|
|
155
|
+
nexaai/vlm_impl/pybind_vlm_impl.py,sha256=MKDZpU_FDwEm6V2wxgP6WrqvyDe5TpACFwHSYF2XwrQ,10021
|
|
156
|
+
nexaai-1.0.24.dist-info/METADATA,sha256=iY5HsgQZcBXjDJwElBoK6V_L-nB2gzyTFcopPlCY6ZM,1215
|
|
157
|
+
nexaai-1.0.24.dist-info/WHEEL,sha256=QL7uMKXoDJRpSwAf1VOVpjVXYPYll2YWTJ-omqdO8-4,101
|
|
158
|
+
nexaai-1.0.24.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
|
|
159
|
+
nexaai-1.0.24.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|