nexaai 1.0.4rc16__cp310-cp310-macosx_13_0_x86_64.whl → 1.0.6rc1__cp310-cp310-macosx_13_0_x86_64.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.

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.4-rc16"
4
+ __version__ = "1.0.6-rc1"
Binary file
Binary file
Binary file
Binary file
Binary file
nexaai/common.py CHANGED
@@ -59,10 +59,45 @@ class ModelConfig:
59
59
 
60
60
  @dataclass(frozen=True) # Read-only
61
61
  class ProfilingData:
62
- start_time: int
63
- end_time: int
64
- prompt_start_time: int = None
65
- prompt_end_time: int = None
66
- decode_start_time: int = None
67
- decode_ent_time: int = None
68
- first_token_time: int = None
62
+ """Profiling data structure for LLM/VLM performance metrics."""
63
+ ttft: int = 0 # Time to first token (us)
64
+ prompt_time: int = 0 # Prompt processing time (us)
65
+ decode_time: int = 0 # Token generation time (us)
66
+ prompt_tokens: int = 0 # Number of prompt tokens
67
+ generated_tokens: int = 0 # Number of generated tokens
68
+ audio_duration: int = 0 # Audio duration (us)
69
+ prefill_speed: float = 0.0 # Prefill speed (tokens/sec)
70
+ decoding_speed: float = 0.0 # Decoding speed (tokens/sec)
71
+ real_time_factor: float = 0.0 # Real-Time Factor (RTF)
72
+ stop_reason: str = "" # Stop reason: "eos", "length", "user", "stop_sequence"
73
+
74
+ @classmethod
75
+ def from_dict(cls, data: dict) -> "ProfilingData":
76
+ """Create ProfilingData from dictionary."""
77
+ return cls(
78
+ ttft=data.get("ttft", 0),
79
+ prompt_time=data.get("prompt_time", 0),
80
+ decode_time=data.get("decode_time", 0),
81
+ prompt_tokens=data.get("prompt_tokens", 0),
82
+ generated_tokens=data.get("generated_tokens", 0),
83
+ audio_duration=data.get("audio_duration", 0),
84
+ prefill_speed=data.get("prefill_speed", 0.0),
85
+ decoding_speed=data.get("decoding_speed", 0.0),
86
+ real_time_factor=data.get("real_time_factor", 0.0),
87
+ stop_reason=data.get("stop_reason", "")
88
+ )
89
+
90
+ def to_dict(self) -> dict:
91
+ """Convert to dictionary."""
92
+ return {
93
+ "ttft": self.ttft,
94
+ "prompt_time": self.prompt_time,
95
+ "decode_time": self.decode_time,
96
+ "prompt_tokens": self.prompt_tokens,
97
+ "generated_tokens": self.generated_tokens,
98
+ "audio_duration": self.audio_duration,
99
+ "prefill_speed": self.prefill_speed,
100
+ "decoding_speed": self.decoding_speed,
101
+ "real_time_factor": self.real_time_factor,
102
+ "stop_reason": self.stop_reason
103
+ }
nexaai/llm.py CHANGED
@@ -4,7 +4,7 @@ import queue
4
4
  import threading
5
5
 
6
6
  from nexaai.common import ModelConfig, GenerationConfig, ChatMessage, PluginID
7
- from nexaai.base import BaseModel
7
+ from nexaai.base import BaseModel, ProfilingData
8
8
 
9
9
  class LLM(BaseModel):
10
10
  def __init__(self, m_cfg: ModelConfig = ModelConfig()):
@@ -63,6 +63,10 @@ class LLM(BaseModel):
63
63
  """
64
64
  pass
65
65
 
66
+ def get_profiling_data(self) -> Optional[ProfilingData]:
67
+ """Get profiling data from the last generation."""
68
+ pass
69
+
66
70
  @abstractmethod
67
71
  def save_kv_cache(self, path: str):
68
72
  """
@@ -1,5 +1,6 @@
1
1
  from typing import Generator, Optional, Any, Sequence, Union
2
2
 
3
+ from nexaai.base import ProfilingData
3
4
  from nexaai.common import ModelConfig, GenerationConfig, ChatMessage, PluginID
4
5
  from nexaai.llm import LLM
5
6
  from nexaai.mlx_backend.llm.interface import LLM as MLXLLMInterface
@@ -215,6 +216,12 @@ class MLXLLMImpl(LLM):
215
216
  except Exception as e:
216
217
  raise RuntimeError(f"Failed to generate text: {str(e)}")
217
218
 
219
+ def get_profiling_data(self) -> Optional[ProfilingData]:
220
+ """Get profiling data from the last generation."""
221
+ if not self._mlx_llm:
222
+ raise RuntimeError("MLX LLM not loaded")
223
+ return self._mlx_llm.get_profiling_data()
224
+
218
225
  def save_kv_cache(self, path: str):
219
226
  """
220
227
  Save the key-value cache to the file.
@@ -2,6 +2,7 @@ from typing import Generator, Optional, Union
2
2
  import queue
3
3
  import threading
4
4
 
5
+ from nexaai.base import ProfilingData
5
6
  from nexaai.common import ModelConfig, GenerationConfig, ChatMessage, PluginID
6
7
  from nexaai.binds import llm_bind, common_bind
7
8
  from nexaai.runtime import _ensure_runtime
@@ -13,6 +14,7 @@ class PyBindLLMImpl(LLM):
13
14
  """Private constructor, should not be called directly."""
14
15
  super().__init__(m_cfg)
15
16
  self._handle = handle # This is a py::capsule
17
+ self._profiling_data = None
16
18
 
17
19
  @classmethod
18
20
  def _load_from(cls,
@@ -97,13 +99,14 @@ class PyBindLLMImpl(LLM):
97
99
  # Run generation in thread
98
100
  def generate():
99
101
  try:
100
- llm_bind.ml_llm_generate(
102
+ result = llm_bind.ml_llm_generate(
101
103
  handle=self._handle,
102
104
  prompt=prompt,
103
105
  config=config,
104
106
  on_token=on_token,
105
107
  user_data=None
106
108
  )
109
+ self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
107
110
  except Exception as e:
108
111
  exception_container[0] = e
109
112
  finally:
@@ -145,8 +148,14 @@ class PyBindLLMImpl(LLM):
145
148
  on_token=None, # No callback for non-streaming
146
149
  user_data=None
147
150
  )
151
+
152
+ self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
148
153
  return result.get("text", "")
149
154
 
155
+ def get_profiling_data(self) -> Optional[ProfilingData]:
156
+ """Get profiling data."""
157
+ return self._profiling_data
158
+
150
159
  def save_kv_cache(self, path: str):
151
160
  """
152
161
  Save the key-value cache to the file.
@@ -371,19 +371,19 @@ class LLM(BaseLLM, ProfilingMixin):
371
371
  cached_tokens = 0
372
372
 
373
373
  # Only offset prefix kv-cache at first round
374
- if is_first_round:
374
+ # if is_first_round:
375
375
 
376
- # Handle KV cache prefix offset if available
377
- if self.kv_cache is not None and len(self.kv_cache) > 0:
378
- # Get the offset from the first cache layer
379
- if hasattr(self.kv_cache[0], 'offset'):
380
- cached_tokens = self.kv_cache[0].offset - 1
376
+ # # Handle KV cache prefix offset if available
377
+ # if self.kv_cache is not None and len(self.kv_cache) > 0:
378
+ # # Get the offset from the first cache layer
379
+ # if hasattr(self.kv_cache[0], 'offset'):
380
+ # cached_tokens = self.kv_cache[0].offset - 1
381
381
 
382
- # Process only the non-cached tokens
383
- incremental_tokens = incremental_tokens[cached_tokens:] if cached_tokens > 0 else incremental_tokens
382
+ # # Process only the non-cached tokens
383
+ # incremental_tokens = incremental_tokens[cached_tokens:] if cached_tokens > 0 else incremental_tokens
384
384
 
385
- if len(incremental_tokens) == 0:
386
- raise ValueError("No tokens to process, KV cache is too long.")
385
+ # if len(incremental_tokens) == 0:
386
+ # raise ValueError("No tokens to process, KV cache is too long.")
387
387
 
388
388
  # Since apply_chat_template now returns incremental prompts, we can use the prompt directly
389
389
  # The prompt is already the incremental part based on global_n_past
nexaai/vlm.py CHANGED
@@ -6,7 +6,7 @@ import base64
6
6
  from pathlib import Path
7
7
 
8
8
  from nexaai.common import ModelConfig, GenerationConfig, MultiModalMessage, PluginID
9
- from nexaai.base import BaseModel
9
+ from nexaai.base import BaseModel, ProfilingData
10
10
 
11
11
 
12
12
  class VLM(BaseModel):
@@ -120,4 +120,8 @@ class VLM(BaseModel):
120
120
  Returns:
121
121
  str: The generated text.
122
122
  """
123
+ pass
124
+
125
+ def get_profiling_data(self) -> Optional[ProfilingData]:
126
+ """Get profiling data from the last generation."""
123
127
  pass
@@ -1,5 +1,6 @@
1
1
  from typing import Generator, Optional, List, Dict, Any, Union
2
2
 
3
+ from nexaai.base import ProfilingData
3
4
  from nexaai.common import ModelConfig, GenerationConfig, MultiModalMessage, PluginID
4
5
  from nexaai.vlm import VLM
5
6
  from nexaai.mlx_backend.vlm.interface import VLM as MLXVLMInterface
@@ -247,3 +248,9 @@ class MlxVlmImpl(VLM):
247
248
 
248
249
  except Exception as e:
249
250
  raise RuntimeError(f"Failed to generate text: {str(e)}")
251
+
252
+ def get_profiling_data(self) -> Optional[ProfilingData]:
253
+ """Get profiling data from the last generation."""
254
+ if not self._mlx_vlm:
255
+ raise RuntimeError("MLX VLM not loaded")
256
+ return self._mlx_vlm.get_profiling_data()
@@ -8,6 +8,7 @@ from nexaai.common import ModelConfig, GenerationConfig, MultiModalMessage, Plug
8
8
  from nexaai.binds import vlm_bind, common_bind
9
9
  from nexaai.runtime import _ensure_runtime
10
10
  from nexaai.vlm import VLM
11
+ from nexaai.base import ProfilingData
11
12
 
12
13
 
13
14
  class PyBindVLMImpl(VLM):
@@ -15,6 +16,7 @@ class PyBindVLMImpl(VLM):
15
16
  """Private constructor, should not be called directly."""
16
17
  super().__init__(m_cfg)
17
18
  self._handle = handle # This is a py::capsule
19
+ self._profiling_data = None
18
20
 
19
21
  @classmethod
20
22
  def _load_from(cls,
@@ -143,13 +145,14 @@ class PyBindVLMImpl(VLM):
143
145
  # Run generation in thread
144
146
  def generate():
145
147
  try:
146
- vlm_bind.ml_vlm_generate(
148
+ result = vlm_bind.ml_vlm_generate(
147
149
  handle=self._handle,
148
150
  prompt=prompt,
149
151
  config=config,
150
152
  on_token=on_token,
151
153
  user_data=None
152
154
  )
155
+ self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
153
156
  except Exception as e:
154
157
  exception_container[0] = e
155
158
  finally:
@@ -191,8 +194,14 @@ class PyBindVLMImpl(VLM):
191
194
  on_token=None, # No callback for non-streaming
192
195
  user_data=None
193
196
  )
197
+
198
+ self._profiling_data = ProfilingData.from_dict(result.get("profile_data", {}))
194
199
  return result.get("text", "")
195
200
 
201
+ def get_profiling_data(self) -> Optional[ProfilingData]:
202
+ """Get profiling data."""
203
+ return self._profiling_data
204
+
196
205
  def _convert_generation_config(self, g_cfg: GenerationConfig):
197
206
  """Convert GenerationConfig to binding format."""
198
207
  config = common_bind.GenerationConfig()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nexaai
3
- Version: 1.0.4rc16
3
+ Version: 1.0.6rc1
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
@@ -17,11 +17,15 @@ Requires-Dist: tqdm
17
17
  Requires-Dist: hf_xet
18
18
  Requires-Dist: numpy
19
19
  Requires-Dist: httpx
20
- Requires-Dist: mlx
21
- Requires-Dist: mlx-lm
22
- Requires-Dist: scipy
23
- Requires-Dist: soundfile
24
- Requires-Dist: Pillow
25
- Requires-Dist: opencv-python
26
- Requires-Dist: shapely
27
- Requires-Dist: pyclipper
20
+ Provides-Extra: mlx
21
+ Requires-Dist: mlx; extra == "mlx"
22
+ Requires-Dist: mlx-lm; extra == "mlx"
23
+ Requires-Dist: mlx-vlm; extra == "mlx"
24
+ Requires-Dist: tokenizers; extra == "mlx"
25
+ Requires-Dist: safetensors; extra == "mlx"
26
+ Requires-Dist: Pillow; extra == "mlx"
27
+ Requires-Dist: scipy; extra == "mlx"
28
+ Requires-Dist: soundfile; extra == "mlx"
29
+ Requires-Dist: opencv-python; extra == "mlx"
30
+ Requires-Dist: shapely; extra == "mlx"
31
+ Requires-Dist: pyclipper; extra == "mlx"
@@ -1,17 +1,17 @@
1
1
  nexaai/__init__.py,sha256=jXdC4vv6DBK1fVewYTYSUhOOYfvf_Mk81UIeMGGIKUg,2029
2
- nexaai/_stub.cpython-310-darwin.so,sha256=7KDZERgfp9KR_dpQvZ7SMrGjlJpPyezLP7v-rYCdqFA,49832
3
- nexaai/_version.py,sha256=NGCgH5JHTkWsbmkVT9FhcM7m4cxgmEZiw51TUG210EA,143
2
+ nexaai/_stub.cpython-310-darwin.so,sha256=i1tMWQy3ZjzlbqlF_pVQbifzoGO0ebEzk8dy5GEgn7Y,49832
3
+ nexaai/_version.py,sha256=o8WPRe-h5be83JEwTPwBVdsZ20QQ2VFyIwzifvgbiPQ,142
4
4
  nexaai/asr.py,sha256=NljMXDErwPNMOPaRkJZMEDka9Nk8xyur7L8i924TStY,2054
5
5
  nexaai/base.py,sha256=N8PRgDFA-XPku2vWnQIofQ7ipz3pPlO6f8YZGnuhquE,982
6
- nexaai/common.py,sha256=5ElYo4uDP2CT3Kqxoo7XzqcJtDBuwwbIi_Wr14aT9Z4,1659
6
+ nexaai/common.py,sha256=yBnIbqYaQYnfrl7IczOBh6MDibYZVxwaRJEglYcKgGs,3422
7
7
  nexaai/cv.py,sha256=RHCDo8gvBH8BkGZx7qVyp-OKxqi7E1GG9XzyaXehCNA,3273
8
8
  nexaai/embedder.py,sha256=Cw0tSHkPgd-RI62afCqQAcTHMnQhaI2CvfTMO-1JKOg,2452
9
9
  nexaai/image_gen.py,sha256=0C_5Tjj4BYmxLbmMmvwajp-yy2mmEEOKwBFnDQNPzx4,4356
10
- nexaai/llm.py,sha256=QQDRg8zlu-xHmWjtSOsK1vhQBHaqRIdL3T9I4cVX7W4,3416
10
+ nexaai/llm.py,sha256=S1o_k2VQoF5w2wO25f142OO1R75TP89Ii69VZv8pIGo,3567
11
11
  nexaai/rerank.py,sha256=vWaBucoQ1wz-2iYnZqyFIcEjm-4Xcs1KDbFN5X8zzDQ,1872
12
12
  nexaai/runtime.py,sha256=mxxHYsb5iBUAm2K_u-XJWr_U-spJ9S4eApc8kf9myjw,1957
13
13
  nexaai/tts.py,sha256=ZnBpWUxIfHhh7KfEjddtH7hHOTa91zg7ogGLakMIALo,2167
14
- nexaai/vlm.py,sha256=pZcMWkF2Ml9liVNbHxLqBJxwm2bxVNM1dkoelwWMyIE,4500
14
+ nexaai/vlm.py,sha256=3voXmAVnGlXnOiwA3wcX4p0Lvmp0X1VKkQVPObJdwBY,4649
15
15
  nexaai/asr_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  nexaai/asr_impl/mlx_asr_impl.py,sha256=eosd8-TIWAOwV0HltmoFrLwzXHcU4jyxtncvuZE9pgA,3257
17
17
  nexaai/asr_impl/pybind_asr_impl.py,sha256=pE9Hb_hMi5yAc4MF83bLVOb8zDtreCkB3_u7XED9YpA,1516
@@ -19,16 +19,16 @@ nexaai/binds/__init__.py,sha256=T9Ua7SzHNglSeEqXlfH5ymYXRyXhNKkC9z_y_bWCNMo,80
19
19
  nexaai/binds/common_bind.cpython-310-darwin.so,sha256=FF5WuJj0fNCim_HjseBQu38vL-1M5zI_7EVTD7Bs-Bc,233960
20
20
  nexaai/binds/embedder_bind.cpython-310-darwin.so,sha256=mU6hP0SyH8vcmPpC2GIr7ioK7539dsg_YbmrBdmj7l0,202032
21
21
  nexaai/binds/libcrypto.dylib,sha256=ysW8ydmDPnnNRy3AHESjJwMTFfmGDKU9eLIaiR37ca0,5091432
22
- nexaai/binds/libnexa_bridge.dylib,sha256=8wjwefnWZLAzEqLlnFdjEWXNmTlRD9y9ogO0_ArRUB4,250712
22
+ nexaai/binds/libnexa_bridge.dylib,sha256=Acbiop5I7SBo5MOOOfYCowkAHsnVcFAwR9xDpTnkwUs,250712
23
23
  nexaai/binds/libssl.dylib,sha256=JHPTSbRFnImmoWDO9rFdiKb0lJMT3q78VEsx-5-S0sk,889520
24
- nexaai/binds/llm_bind.cpython-310-darwin.so,sha256=g4erKCUm2qdMZk1WUrr3IAXixRNp78ViUEkbE5jDOfE,182872
25
- nexaai/binds/nexa_llama_cpp/libggml-base.dylib,sha256=ChIX99NoLhsYVXJvv8iGMIpx-5Rst2gYwux-bEektB4,626992
26
- nexaai/binds/nexa_llama_cpp/libggml-cpu.so,sha256=tZcQGr6aWSQmTN12ieC2nIJ0lID5-mTkqoGjxJh07b4,1039744
27
- nexaai/binds/nexa_llama_cpp/libggml-metal.so,sha256=eDWuZ4ui8LsahlU05sNEMZ7lTtZfswKtcGcGvWTB0ro,713680
24
+ nexaai/binds/llm_bind.cpython-310-darwin.so,sha256=aYqMs5VhC07RNZZgyS9JeYJJgWCl-toZOmt6vXu5yp0,183008
25
+ nexaai/binds/nexa_llama_cpp/libggml-base.dylib,sha256=oikz7Qxzx6A0mPROq7uHTUwWn66LvvOjcdVstG-M8Fw,629528
26
+ nexaai/binds/nexa_llama_cpp/libggml-cpu.so,sha256=WepzOOeElmdOlsoMv7loLHsj8-Qx2O9ZJPlNnX11KJI,1039800
27
+ nexaai/binds/nexa_llama_cpp/libggml-metal.so,sha256=ssn3Bqmnu7YA_FKL513Y18gbxG8WP9Udw71DNKV34eo,713680
28
28
  nexaai/binds/nexa_llama_cpp/libggml.dylib,sha256=Z2ZvkyEEpPtHhMYap-44p9Q0M6TXJbLcMy-smR2X5sk,58336
29
- nexaai/binds/nexa_llama_cpp/libllama.dylib,sha256=9pJFMHFlKHiQgLzi8YXextf5dPCYylQkpDv0EvCEssM,1958384
30
- nexaai/binds/nexa_llama_cpp/libmtmd.dylib,sha256=Etc0ZuYVNo9l1OTQRjZY4cTkgH2S2EL84DpxpWJeoJ4,682480
31
- nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib,sha256=GzhOq5vFIQAii3zh4oRN_TjcpqNLYEstsBiUAa96fUA,2589576
29
+ nexaai/binds/nexa_llama_cpp/libllama.dylib,sha256=QZBn_w32g8NAJLE1unC_qx1BCVM531LeqTUqWipt9ks,1982280
30
+ nexaai/binds/nexa_llama_cpp/libmtmd.dylib,sha256=F1QLNlfjiECRssUtEZeuqNqej-8COYcQjMZKPAB0CGk,701504
31
+ nexaai/binds/nexa_llama_cpp/libnexa_plugin.dylib,sha256=csMdM6l21qpj-3_4z0xGsYM1snOBg4cJPfLXOQ8oTcI,2644752
32
32
  nexaai/cv_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  nexaai/cv_impl/mlx_cv_impl.py,sha256=gKECQOv8iaWwG3bl7xeqVy2NN_9K7tYerIFzfn4eLo4,3228
34
34
  nexaai/cv_impl/pybind_cv_impl.py,sha256=uSmwBste4cT7c8DQmXzRLmzwDf773PAbXNYWW1UzVls,1064
@@ -39,8 +39,8 @@ nexaai/image_gen_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
39
39
  nexaai/image_gen_impl/mlx_image_gen_impl.py,sha256=BuDkksvXyb4J02GsdnbGAmYckfUU0Eah6BimoMD3QqY,11219
40
40
  nexaai/image_gen_impl/pybind_image_gen_impl.py,sha256=ms34VYoD5AxZFG6cIG0QAJDjCtfphaZ1bHzKzey1xF8,3692
41
41
  nexaai/llm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- nexaai/llm_impl/mlx_llm_impl.py,sha256=2Ifc_mfTHDX64BWVHLjOhFCIMqM_Z-Cn4RfExlMtq0s,10865
43
- nexaai/llm_impl/pybind_llm_impl.py,sha256=DpO38rlGcvf0Zpe4bPKsbPD3EguBf0dDS9Ve64bgdvo,7653
42
+ nexaai/llm_impl/mlx_llm_impl.py,sha256=4v7jUFzHfE7zw2uViekGQDaTROz8A6oaW31Z3iVe6tg,11157
43
+ nexaai/llm_impl/pybind_llm_impl.py,sha256=aooqkcXZWhCo07wbSafGgBrA3WnijtnUADShjjgFsBQ,8051
44
44
  nexaai/mlx_backend/ml.py,sha256=LafDM_TeXmuQkld2tdQxUBGgooT0JPMXngLam2TADqU,23179
45
45
  nexaai/mlx_backend/profiling.py,sha256=Dc-mybFwBdCIKFWL7CbSHjkOJGAoYHG7r_e_XPhzwBU,9361
46
46
  nexaai/mlx_backend/asr/__init__.py,sha256=fuT_9_xpYJ28m4yjly5L2jChUrzlSQz-b_S7nujxkSM,451
@@ -60,7 +60,7 @@ nexaai/mlx_backend/embedding/modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
60
60
  nexaai/mlx_backend/embedding/modeling/nexa_jina_v2.py,sha256=F9Z_9r-Dh0wNThiMp5W5hqE2dt5bf4ps5_c6h4BuWGw,15218
61
61
  nexaai/mlx_backend/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  nexaai/mlx_backend/llm/generate.py,sha256=Phes0tzxbbEWA2hDylQvD0LjorMaPwvcfZq9RKCAOt0,4399
63
- nexaai/mlx_backend/llm/interface.py,sha256=YBLAdz_5gQ1VF9o98Tuj6xB_M2nUB9kX9VkM-Mp6ryc,29310
63
+ nexaai/mlx_backend/llm/interface.py,sha256=SZFkuAUi2vxj_dSqj8RXf9vPTGMtpks_pZxxrF7iIe8,29330
64
64
  nexaai/mlx_backend/llm/main.py,sha256=gFDE4VZv_CLKMCTn0N521OfCKH_Ys26bHDh6g9VEFNc,1982
65
65
  nexaai/mlx_backend/mlx_audio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  nexaai/mlx_backend/mlx_audio/server.py,sha256=Pqy13Fafq4WX_cTuvRFz1jq89beQm2QQGpXmhK4b9jc,17547
@@ -361,9 +361,9 @@ nexaai/utils/decode.py,sha256=61n4Zf6c5QLyqGoctEitlI9BX3tPlP2a5aaKNHbw3T4,404
361
361
  nexaai/utils/model_manager.py,sha256=c07ocxxw1IHCQw6esbmYK0dX2R2OajfEIGsC_2teHXo,48572
362
362
  nexaai/utils/progress_tracker.py,sha256=76HlPkyN41IMHSsH56-qdlN_aY_oBfJz50J16Cx67R0,15102
363
363
  nexaai/vlm_impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
364
- nexaai/vlm_impl/mlx_vlm_impl.py,sha256=Dm-N38wqK3Cjdk3n7wfVGKC7hwxHvaM8pz37VzvJC-Y,10443
365
- nexaai/vlm_impl/pybind_vlm_impl.py,sha256=mvydHMHNWtkmyqouLIj1XSYZgsro3tcp3s_aqkjljE0,8510
366
- nexaai-1.0.4rc16.dist-info/METADATA,sha256=NuLsDWtJssKVjTNP4oo-tFItIBxIbiq-0hTq1rv706s,883
367
- nexaai-1.0.4rc16.dist-info/WHEEL,sha256=0KYp5feZ1CMUhsfFXKpSQTbSmQbXy4mv6yPPVBXg2EM,110
368
- nexaai-1.0.4rc16.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
369
- nexaai-1.0.4rc16.dist-info/RECORD,,
364
+ nexaai/vlm_impl/mlx_vlm_impl.py,sha256=od1R1mRoIgPG3NHC7JiDlcB_YJY8aklX8Em3ZkeHNpE,10734
365
+ nexaai/vlm_impl/pybind_vlm_impl.py,sha256=5ZMFgDATthmMzjrd-vE5KX5ZAMoWPYbF_FTLz8DBKIk,8908
366
+ nexaai-1.0.6rc1.dist-info/METADATA,sha256=U2gJx8JlzG3wUYtVYk7VdDN7ildkHxWTQUE5Oya_Z_s,1154
367
+ nexaai-1.0.6rc1.dist-info/WHEEL,sha256=0KYp5feZ1CMUhsfFXKpSQTbSmQbXy4mv6yPPVBXg2EM,110
368
+ nexaai-1.0.6rc1.dist-info/top_level.txt,sha256=LRE2YERlrZk2vfuygnSzsEeqSknnZbz3Z1MHyNmBU4w,7
369
+ nexaai-1.0.6rc1.dist-info/RECORD,,