nexaai 1.0.23__cp312-cp312-win_arm64.whl → 1.0.24__cp312-cp312-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.

Files changed (38) hide show
  1. nexaai/__init__.py +15 -11
  2. nexaai/_stub.cp312-win_arm64.pyd +0 -0
  3. nexaai/_version.py +1 -1
  4. nexaai/binds/__init__.py +1 -0
  5. nexaai/binds/asr_bind.cp312-win_arm64.pyd +0 -0
  6. nexaai/binds/common_bind.cp312-win_arm64.pyd +0 -0
  7. nexaai/binds/cpu_gpu/ggml-base.dll +0 -0
  8. nexaai/binds/cpu_gpu/ggml-cpu.dll +0 -0
  9. nexaai/binds/cpu_gpu/ggml-opencl.dll +0 -0
  10. nexaai/binds/cpu_gpu/ggml.dll +0 -0
  11. nexaai/binds/cpu_gpu/mtmd.dll +0 -0
  12. nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll +0 -0
  13. nexaai/binds/cpu_gpu/nexa_plugin.dll +0 -0
  14. nexaai/binds/cv_bind.cp312-win_arm64.pyd +0 -0
  15. nexaai/binds/diarize_bind.cp312-win_arm64.pyd +0 -0
  16. nexaai/binds/embedder_bind.cp312-win_arm64.pyd +0 -0
  17. nexaai/binds/llm_bind.cp312-win_arm64.pyd +0 -0
  18. nexaai/binds/nexa_bridge.dll +0 -0
  19. nexaai/binds/npu/ggml-base.dll +0 -0
  20. nexaai/binds/npu/ggml-cpu.dll +0 -0
  21. nexaai/binds/npu/ggml-opencl.dll +0 -0
  22. nexaai/binds/npu/ggml.dll +0 -0
  23. nexaai/binds/npu/granite-nano-sdk.dll +0 -0
  24. nexaai/binds/npu/nexa-mm-process.dll +0 -0
  25. nexaai/binds/npu/nexa_plugin.dll +0 -0
  26. nexaai/binds/npu/pyannote-sdk.dll +0 -0
  27. nexaai/binds/rerank_bind.cp312-win_arm64.pyd +0 -0
  28. nexaai/binds/vlm_bind.cp312-win_arm64.pyd +0 -0
  29. nexaai/common.py +1 -0
  30. nexaai/diarize.py +80 -0
  31. nexaai/diarize_impl/__init__.py +1 -0
  32. nexaai/diarize_impl/pybind_diarize_impl.py +125 -0
  33. nexaai/llm_impl/pybind_llm_impl.py +44 -26
  34. nexaai/vlm_impl/pybind_vlm_impl.py +50 -31
  35. {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/METADATA +1 -1
  36. {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/RECORD +38 -34
  37. {nexaai-1.0.23.dist-info → nexaai-1.0.24.dist-info}/WHEEL +0 -0
  38. {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 ImageGen, ImageGenerationConfig, ImageSamplerConfig, SchedulerConfig, Image
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
-
Binary file
nexaai/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is generated by CMake from _version.py.in
2
2
  # Do not modify this file manually - it will be overwritten
3
3
 
4
- __version__ = "1.0.23"
4
+ __version__ = "1.0.24"
nexaai/binds/__init__.py CHANGED
@@ -4,3 +4,4 @@ from .embedder_bind import *
4
4
  from .vlm_bind import *
5
5
  from .rerank_bind import *
6
6
  from .asr_bind import *
7
+ from .diarize_bind import *
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
nexaai/binds/npu/ggml.dll CHANGED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
nexaai/common.py CHANGED
@@ -57,6 +57,7 @@ class ModelConfig:
57
57
  n_gpu_layers: int = 999
58
58
  chat_template_path: str = None
59
59
  chat_template_content: str = None
60
+ system_prompt: str = None # For NPU plugin: system prompt must be set at model creation time
60
61
 
61
62
 
62
63
  @dataclass(frozen=True) # Read-only
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(cls,
21
- local_path: str,
22
- model_name: Optional[str] = None,
23
- tokenizer_path: Optional[str] = None,
24
- m_cfg: ModelConfig = ModelConfig(),
25
- plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
26
- device_id: Optional[str] = None
27
- ) -> 'PyBindLLMImpl':
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 = plugin_id.value if isinstance(plugin_id, PluginID) else plugin_id
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(self, messages: list[ChatMessage], tools: Optional[str] = None, enable_thinking: bool = True, add_generation_prompt: bool = True) -> str:
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
- {"role": m["role"], "content": m["content"]}
78
- for m in messages
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(self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()) -> Generator[str, None, None]:
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(('end', None))
104
+ token_queue.put(("end", None))
91
105
  return False # Stop generation
92
106
  try:
93
- token_queue.put(('token', token))
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(('end', None))
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 == 'token':
140
+ if msg_type == "token":
125
141
  yield token
126
- elif msg_type in ('error', 'end'):
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(self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()) -> str:
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(cls,
27
- local_path: str,
28
- mmproj_path: str = None,
29
- model_name: Optional[str] = None,
30
- m_cfg: ModelConfig = ModelConfig(),
31
- plugin_id: Union[PluginID, str] = PluginID.LLAMA_CPP,
32
- device_id: Optional[str] = None
33
- ) -> 'PyBindVLMImpl':
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 = plugin_id.value if isinstance(plugin_id, PluginID) else plugin_id
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 = msg["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(self._handle, payload, tools, enable_thinking)
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(self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()) -> Generator[str, None, None]:
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(('end', None))
141
+ token_queue.put(("end", None))
131
142
  return False # Stop generation
132
143
  try:
133
- token_queue.put(('token', token))
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(error_message, error_code)
168
+ exception_container[0] = ContextLengthExceededError(
169
+ error_message, error_code
170
+ )
158
171
  else:
159
- exception_container[0] = GenerationError(error_message, error_code)
160
- token_queue.put(('end', None))
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(result.get("profile_data", {}))
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(('end', None))
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 == 'token':
193
+ if msg_type == "token":
177
194
  yield token
178
- elif msg_type in ('error', 'end'):
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(self, prompt: str, g_cfg: GenerationConfig = GenerationConfig()) -> str:
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nexaai
3
- Version: 1.0.23
3
+ Version: 1.0.24
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
@@ -1,10 +1,11 @@
1
- nexaai/__init__.py,sha256=gOd7sNsqEESopw_24xgnOSkIRENrk4Fa-RMtmVv62eA,2421
2
- nexaai/_stub.cp312-win_arm64.pyd,sha256=2pzl2OoRX7l_pgivrITdZulTRIjoLmzWfEPCDeyoHV8,10240
3
- nexaai/_version.py,sha256=jvuw8FsRzBuy2gWtiNcMHIovBrvEB6BUEhxloSiR5bE,143
1
+ nexaai/__init__.py,sha256=S6GrUD-_rZhDY2tcIY4aJvNIZa6KOk6TfV26Jb6x0pE,2582
2
+ nexaai/_stub.cp312-win_arm64.pyd,sha256=oLgXSsrh2-vsD0O75JkzVqFl2ZTUns-TCtcWtEBWPOM,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=MRWZ6a7pnci_OUHxZRm3YqgKLAtZFD7b88STYDfeIF8,3460
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=2-Rr0NwyWygqwS8Xlxq0BJ2ltyID-WbGuzEYNlSanCI,155
21
- nexaai/binds/asr_bind.cp312-win_arm64.pyd,sha256=dkkqB28yfpzla1pSjblEaADdU2jPNlndgdehVZ-3oQU,268288
22
- nexaai/binds/common_bind.cp312-win_arm64.pyd,sha256=cOqbhLKbrWaZOVHjz88pgluDxH2hmNuMj_tm5pV4iEI,291840
23
- nexaai/binds/cv_bind.cp312-win_arm64.pyd,sha256=B4Ms9YVVzPUA4dlrf7A1jX9Jf3IP56Ytpw_PfPEb06U,328192
24
- nexaai/binds/embedder_bind.cp312-win_arm64.pyd,sha256=4rcrvByACraFdWFYyNWPJPvbw95vlj1-6Ytu2vy5WiA,244224
21
+ nexaai/binds/__init__.py,sha256=-dSUMEA_-SghPgdI0qE2RWF2Fng_Klu2rGpP5zqA8_o,183
22
+ nexaai/binds/asr_bind.cp312-win_arm64.pyd,sha256=QmLnDYJU_7Zr5C-CvE699xLx-B4gVJjnB0Y4ekKW9sA,268288
23
+ nexaai/binds/common_bind.cp312-win_arm64.pyd,sha256=Sv8kbOp0mirxNzNQalFQBo13tOoOT_Go-mNp71PKADc,294400
24
+ nexaai/binds/cv_bind.cp312-win_arm64.pyd,sha256=GdZrmdMwnpidU663rOAADbwaftS7G7xVNmMVb8eP9zc,328192
25
+ nexaai/binds/diarize_bind.cp312-win_arm64.pyd,sha256=Gy13_ebx-qOwiJ-WFyam3hCt3zsmcSmIyCRPZATOu8Y,232448
26
+ nexaai/binds/embedder_bind.cp312-win_arm64.pyd,sha256=8Oawp9vSO2L852bEPs0DDW_hokTlzwz7Hc0A48if4vQ,244224
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.cp312-win_arm64.pyd,sha256=DW7toFVatwfwMw_hl8j1id87DG7vSfF-x0GJy-CJD4c,226304
28
- nexaai/binds/nexa_bridge.dll,sha256=xWk4X4Sxk4jaKV_ZuZRd7lWswhzBVNJAQ-zL-fn-BwQ,231936
29
- nexaai/binds/rerank_bind.cp312-win_arm64.pyd,sha256=Wh2fkZWxKQA0EDR7hUl0IaguOuMkWb1vsmuDl2OB6YA,239104
30
- nexaai/binds/vlm_bind.cp312-win_arm64.pyd,sha256=hLv9z-b37_1vIcp0igVb5g7J6KfTomBtYV-AOF8Gc8c,238080
31
- nexaai/binds/cpu_gpu/ggml-base.dll,sha256=LpdaYZoJ_58wyZMULIc9hwcqMs_BDui_GZkFPhpbE5g,534016
32
- nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=oeJ75gkBy8LO6Qo23oOVWyR_x6S9d8kRpD4KNUCqVW4,555520
33
- nexaai/binds/cpu_gpu/ggml-opencl.dll,sha256=xOlyqyY--PYMmXWmlkyXrJJGbKOshCc5EvXca87mXyo,620544
34
- nexaai/binds/cpu_gpu/ggml.dll,sha256=ulMzQbECNkUjCFHKI9-KhsW4fPfH1XLdehXcdDm0l1o,70656
29
+ nexaai/binds/llm_bind.cp312-win_arm64.pyd,sha256=IV5tGGK59_F0D15px5MuCgmya94cEilvvKRxgeHJ10Y,226304
30
+ nexaai/binds/nexa_bridge.dll,sha256=sh_kJ-0KQA30JPl8USPtKMGClR_qjpyTWs2O8lHXkJk,231936
31
+ nexaai/binds/rerank_bind.cp312-win_arm64.pyd,sha256=jkAwxcjf0lBpVc30HFS7PUOqy9yXLXkZZ3J6EcujaZs,239104
32
+ nexaai/binds/vlm_bind.cp312-win_arm64.pyd,sha256=rRTwrf6LRyF0t9KFW9dadLUWyF7vvyZHozWWX_WFMQI,238080
33
+ nexaai/binds/cpu_gpu/ggml-base.dll,sha256=G8iy45dX-ccETZbq525rzNvEt0ec1OpFIuz4Ef3T9EY,534016
34
+ nexaai/binds/cpu_gpu/ggml-cpu.dll,sha256=onQj0ebdwUktmYKiEw4FrrWZAJAvRtBQIL5xWTsihoQ,555520
35
+ nexaai/binds/cpu_gpu/ggml-opencl.dll,sha256=VRN98nTn6tsj5enQwI0ZZviBvhDbPi24mS_8ITVl-ZM,620544
36
+ nexaai/binds/cpu_gpu/ggml.dll,sha256=W6Pn1-sxGl4DV2kJP5sos2KfOW7PY4u0k2el_eKE8Jg,70656
35
37
  nexaai/binds/cpu_gpu/libomp140.aarch64.dll,sha256=0mSWmPxoRm7ojPWK46sPqxBvKTJug6qqVkPTBlGpYuM,599504
36
- nexaai/binds/cpu_gpu/mtmd.dll,sha256=S_ZrDTPG-N4tm8vi43vsZkV2gWFiE7zDW9kYsEzxOrs,551936
37
- nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=STSYHzzH8WL3YKGbj_2cTagg9jyQDRyCp7omlsMhh8s,1581056
38
- nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256=zuTpBqLOf6vp1dnuLcNki6tWat2-0iC7EpDschEO-y0,2177024
38
+ nexaai/binds/cpu_gpu/mtmd.dll,sha256=iVqBzq-Jn0FLeo6vdvOV1O6tHYcqOX_KBEYPM5Hq2OY,551936
39
+ nexaai/binds/cpu_gpu/nexa_cpu_gpu.dll,sha256=wVRBcox1HkInvyySCPQ_D_gij7r-2l4n6IFdNGSFISU,1581056
40
+ nexaai/binds/cpu_gpu/nexa_plugin.dll,sha256=7wCtJG6kJcdt1RxFYQnPOheN58acXyquYpcjLPAUN7I,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=LpdaYZoJ_58wyZMULIc9hwcqMs_BDui_GZkFPhpbE5g,534016
45
- nexaai/binds/npu/ggml-cpu.dll,sha256=oeJ75gkBy8LO6Qo23oOVWyR_x6S9d8kRpD4KNUCqVW4,555520
46
- nexaai/binds/npu/ggml-opencl.dll,sha256=xOlyqyY--PYMmXWmlkyXrJJGbKOshCc5EvXca87mXyo,620544
47
- nexaai/binds/npu/ggml.dll,sha256=ulMzQbECNkUjCFHKI9-KhsW4fPfH1XLdehXcdDm0l1o,70656
48
- nexaai/binds/npu/granite-nano-sdk.dll,sha256=03FsvBYHRjd7ryR57Drf5PQ1R-A0qkmLtTIJJQGHfVo,4841984
46
+ nexaai/binds/npu/ggml-base.dll,sha256=G8iy45dX-ccETZbq525rzNvEt0ec1OpFIuz4Ef3T9EY,534016
47
+ nexaai/binds/npu/ggml-cpu.dll,sha256=onQj0ebdwUktmYKiEw4FrrWZAJAvRtBQIL5xWTsihoQ,555520
48
+ nexaai/binds/npu/ggml-opencl.dll,sha256=VRN98nTn6tsj5enQwI0ZZviBvhDbPi24mS_8ITVl-ZM,620544
49
+ nexaai/binds/npu/ggml.dll,sha256=W6Pn1-sxGl4DV2kJP5sos2KfOW7PY4u0k2el_eKE8Jg,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=rZvP8d8eVjSqKGTkeoNV7Ill_gSjSzJ4XJ1p-Tt92rk,5470208
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=ccgrlkLI6JiJagSCMVqFzl0Y-OdBhVgmje63wLkva_k,773632
62
+ nexaai/binds/npu/nexa_plugin.dll,sha256=vy1xQWT8gM_Sn3sgC20NPgehLg0wwcet8yd8yKB1-lU,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=ptzE3gdX57P8AU8M1i-eoAbParNROPAr7jVstb14Wlc,1217536
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=-OFruPYQlAQvy0py6JoBQapBLbRCSgwuZ84WymHtLT0,8163
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=stJKHdhYhBuWUQkky-nHgCv625qDB_1geI3v5BLNGpM,9765
152
- nexaai-1.0.23.dist-info/METADATA,sha256=ghgqII8_rVkGTKEww-GkKbxEtYSuGl5oWOlqoQXKqBQ,1215
153
- nexaai-1.0.23.dist-info/WHEEL,sha256=me1aG6nvouDIdjWXNa5q_zebZZEPzD53N4rwsapSjvI,101
154
- nexaai-1.0.23.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
155
- nexaai-1.0.23.dist-info/RECORD,,
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=me1aG6nvouDIdjWXNa5q_zebZZEPzD53N4rwsapSjvI,101
158
+ nexaai-1.0.24.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
159
+ nexaai-1.0.24.dist-info/RECORD,,