neuralnode 2.1.12__tar.gz → 2.1.14__tar.gz

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.
Files changed (116) hide show
  1. {neuralnode-2.1.12 → neuralnode-2.1.14}/PKG-INFO +1 -1
  2. {neuralnode-2.1.12 → neuralnode-2.1.14}/pyproject.toml +1 -1
  3. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/horus.py +74 -10
  4. {neuralnode-2.1.12 → neuralnode-2.1.14}/.env.example +0 -0
  5. {neuralnode-2.1.12 → neuralnode-2.1.14}/.github/workflows/tests.yml +0 -0
  6. {neuralnode-2.1.12 → neuralnode-2.1.14}/Dockerfile +0 -0
  7. {neuralnode-2.1.12 → neuralnode-2.1.14}/LICENSE +0 -0
  8. {neuralnode-2.1.12 → neuralnode-2.1.14}/README.md +0 -0
  9. {neuralnode-2.1.12 → neuralnode-2.1.14}/docker-compose.yml +0 -0
  10. {neuralnode-2.1.12 → neuralnode-2.1.14}/docs/documentation.md +0 -0
  11. {neuralnode-2.1.12 → neuralnode-2.1.14}/docs/ecosystem_plan.md +0 -0
  12. {neuralnode-2.1.12 → neuralnode-2.1.14}/docs/replica_voice_ids.csv +0 -0
  13. {neuralnode-2.1.12 → neuralnode-2.1.14}/docs/replica_voice_ids.md +0 -0
  14. {neuralnode-2.1.12 → neuralnode-2.1.14}/docs/telegram_guide.md +0 -0
  15. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/agent_with_tools.py +0 -0
  16. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/basic_chat.py +0 -0
  17. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/01_basic_usage.py +0 -0
  18. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/02_horus_lens.py +0 -0
  19. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/03_one_liner.py +0 -0
  20. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/04_custom_cache.py +0 -0
  21. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/05_4bit_quantization.py +0 -0
  22. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/06_8bit_quantization.py +0 -0
  23. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/07_multi_gpu.py +0 -0
  24. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/08_flash_attention.py +0 -0
  25. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/09_data_types.py +0 -0
  26. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/10_generation_params.py +0 -0
  27. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/11_streaming.py +0 -0
  28. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/12_chat_templates.py +0 -0
  29. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/13_offline_mode.py +0 -0
  30. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/14_force_download.py +0 -0
  31. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/15_model_info.py +0 -0
  32. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/16_cpu_offloading.py +0 -0
  33. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/17_cpu_only.py +0 -0
  34. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/18_production_setup.py +0 -0
  35. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/19_gguf_4bit.py +0 -0
  36. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/20_gguf_5bit.py +0 -0
  37. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/21_gguf_6bit.py +0 -0
  38. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/22_gguf_8bit.py +0 -0
  39. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/23_gguf_16bit.py +0 -0
  40. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/24_list_models.py +0 -0
  41. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/25_interactive_chat.py +0 -0
  42. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_codes_camples/README.md +0 -0
  43. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_download_guide.py +0 -0
  44. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_examples.py +0 -0
  45. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_tq_ready_gguf.py +0 -0
  46. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/horus_transformers_features.py +0 -0
  47. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/local_models.py +0 -0
  48. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/neuralnode_v21_complete_demo.py +0 -0
  49. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/shade_model_with_tools.py +0 -0
  50. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/telegram_bot_demo.py +0 -0
  51. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/thinking_mode_example.py +0 -0
  52. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/tts_demo.py +0 -0
  53. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/turboquant_example.py +0 -0
  54. {neuralnode-2.1.12 → neuralnode-2.1.14}/examples/v3_features.py +0 -0
  55. {neuralnode-2.1.12 → neuralnode-2.1.14}/horus_chat_voice.py +0 -0
  56. {neuralnode-2.1.12 → neuralnode-2.1.14}/neuralnode_horus_replica_telegram.ipynb +0 -0
  57. {neuralnode-2.1.12 → neuralnode-2.1.14}/publish.bat +0 -0
  58. {neuralnode-2.1.12 → neuralnode-2.1.14}/publish.sh +0 -0
  59. {neuralnode-2.1.12 → neuralnode-2.1.14}/requirements_shade.txt +0 -0
  60. {neuralnode-2.1.12 → neuralnode-2.1.14}/scripts/setup.py +0 -0
  61. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/debug_import.py +0 -0
  62. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/__init__.py +0 -0
  63. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/agents/__init__.py +0 -0
  64. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/chains/__init__.py +0 -0
  65. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/config/__init__.py +0 -0
  66. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/core/__init__.py +0 -0
  67. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/core/openai_blocker.py +0 -0
  68. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/diagnostics/__init__.py +0 -0
  69. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/integrations/discord.py +0 -0
  70. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/integrations/slack.py +0 -0
  71. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/integrations/telegram.py +0 -0
  72. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/integrations/whatsapp.py +0 -0
  73. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/memory/__init__.py +0 -0
  74. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/memory/advanced.py +0 -0
  75. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/prompts/__init__.py +0 -0
  76. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/__init__.py +0 -0
  77. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/base.py +0 -0
  78. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/__init__.py +0 -0
  79. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/ai21.py +0 -0
  80. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/anthropic.py +0 -0
  81. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/cohere.py +0 -0
  82. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/deepseek.py +0 -0
  83. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/fireworks.py +0 -0
  84. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/google.py +0 -0
  85. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/groq.py +0 -0
  86. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/mistral.py +0 -0
  87. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/perplexity.py +0 -0
  88. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat/together.py +0 -0
  89. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/chat_models.py +0 -0
  90. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/embeddings.py +0 -0
  91. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/local/__init__.py +0 -0
  92. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/local_providers.py +0 -0
  93. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/text_generation.py +0 -0
  94. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/providers/universal_local.py +0 -0
  95. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/rag/__init__.py +0 -0
  96. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/rag/loaders.py +0 -0
  97. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/reasoning/__init__.py +0 -0
  98. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/replica.py +0 -0
  99. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/speech/__init__.py +0 -0
  100. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/thinking.py +0 -0
  101. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/__init__.py +0 -0
  102. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/advanced.py +0 -0
  103. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/multisearch.py +0 -0
  104. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/system/__init__.py +0 -0
  105. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/system/operations.py +0 -0
  106. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tools/web/__init__.py +0 -0
  107. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/tts/__init__.py +0 -0
  108. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/turboquant.py +0 -0
  109. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/utils/__init__.py +0 -0
  110. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/utils/dependencies.py +0 -0
  111. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/utils/logger.py +0 -0
  112. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/utils/metrics.py +0 -0
  113. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/vectorstores/__init__.py +0 -0
  114. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/neuralnode/vision/__init__.py +0 -0
  115. {neuralnode-2.1.12 → neuralnode-2.1.14}/src/nn/__init__.py +0 -0
  116. {neuralnode-2.1.12 → neuralnode-2.1.14}/temp_header.gguf +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: neuralnode
3
- Version: 2.1.12
3
+ Version: 2.1.14
4
4
  Summary: Comprehensive AI Framework with 50+ LLM Providers, Advanced Agents, Chains, Memory, RAG, and 100+ Tools
5
5
  Project-URL: Homepage, https://assem.cloud/
6
6
  Project-URL: Documentation, https://neuralnode.readthedocs.io
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "neuralnode"
7
- version = "2.1.12"
7
+ version = "2.1.14"
8
8
  description = "Comprehensive AI Framework with 50+ LLM Providers, Advanced Agents, Chains, Memory, RAG, and 100+ Tools"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -385,6 +385,7 @@ class HorusProvider(BaseLLMProvider):
385
385
  self.model_id = model_id
386
386
  self.device = device or self._resolve_device()
387
387
  self.n_gpu_layers = n_gpu_layers
388
+ self._user_specified_dtype = torch_dtype # track explicit user choice
388
389
  self.torch_dtype = self._resolve_torch_dtype(torch_dtype)
389
390
  self.load_in_8bit = load_in_8bit
390
391
  self.load_in_4bit = load_in_4bit
@@ -504,6 +505,8 @@ class HorusProvider(BaseLLMProvider):
504
505
  if torch is None:
505
506
  return None
506
507
  if torch_dtype is None:
508
+ if self.device == "cuda" and torch.cuda.is_available() and torch.cuda.is_bf16_supported():
509
+ return torch.bfloat16
507
510
  return torch.float16 if self.device == "cuda" else torch.float32
508
511
  if isinstance(torch_dtype, str):
509
512
  mapping = {
@@ -518,6 +521,24 @@ class HorusProvider(BaseLLMProvider):
518
521
  return mapping.get(torch_dtype.lower(), torch.float16)
519
522
  return torch_dtype
520
523
 
524
+ def _resolve_t2i_dtype(self) -> Any:
525
+ """Determine a safe dtype for text-to-image (Lens) models.
526
+
527
+ Flux/ZImage-class transformers overflow in float16 attention layers on GPUs
528
+ that lack native bfloat16 (e.g. Tesla T4, GTX 16xx). This helper picks the
529
+ safest dtype that will actually produce a visible image:
530
+ * bfloat16 if hardware-supported (Ampere+) – fast & numerically safe
531
+ * float32 otherwise (T4 / Turing) – slower but correct
532
+ """
533
+ if torch is None:
534
+ return None
535
+ if self.device != "cuda" or not torch.cuda.is_available():
536
+ return torch.float32
537
+ if torch.cuda.is_bf16_supported():
538
+ return torch.bfloat16
539
+ # T4 / Turing – float16 overflows in transformer attention, use float32
540
+ return torch.float32
541
+
521
542
  @staticmethod
522
543
  def _is_gguf_model_id(model_id: str) -> bool:
523
544
  return model_id.lower().endswith(".gguf")
@@ -638,8 +659,12 @@ class HorusProvider(BaseLLMProvider):
638
659
  pipeline_kwargs["revision"] = self.revision
639
660
  if self.variant:
640
661
  pipeline_kwargs["variant"] = self.variant
641
- if self.torch_dtype is not None:
642
- pipeline_kwargs["torch_dtype"] = self.torch_dtype
662
+ # Use a safe dtype for text-to-image; user-explicit overrides are honoured.
663
+ t2i_dtype = self.torch_dtype
664
+ if self._user_specified_dtype is None:
665
+ t2i_dtype = self._resolve_t2i_dtype()
666
+ if t2i_dtype is not None:
667
+ pipeline_kwargs["torch_dtype"] = t2i_dtype
643
668
 
644
669
  try:
645
670
  # Check if this model is Horus-Lens-1.0 which requires custom component mapping
@@ -699,10 +724,7 @@ class HorusProvider(BaseLLMProvider):
699
724
  "Only public Hugging Face repositories are supported."
700
725
  ) from exc
701
726
 
702
- if hasattr(self.model, "to"):
703
- self.model = self.model.to(self.device)
704
- if hasattr(self.model, "set_progress_bar_config") and self.suppress_native_output:
705
- self.model.set_progress_bar_config(disable=True)
727
+ self._finalize_t2i_pipeline()
706
728
  return self
707
729
 
708
730
  def _load_gguf_text_to_image(self) -> "HorusProvider":
@@ -813,7 +835,9 @@ class HorusProvider(BaseLLMProvider):
813
835
  except ImportError:
814
836
  GGUFQuantizationConfig = None
815
837
 
816
- compute_dtype = self.torch_dtype or (torch.bfloat16 if self.device == "cuda" else torch.float32)
838
+ compute_dtype = self._resolve_t2i_dtype() if self._user_specified_dtype is None else self.torch_dtype
839
+ if compute_dtype is None:
840
+ compute_dtype = torch.float32
817
841
 
818
842
  transformer_kwargs = {
819
843
  "torch_dtype": compute_dtype,
@@ -870,8 +894,9 @@ class HorusProvider(BaseLLMProvider):
870
894
  pipeline_kwargs["revision"] = self.revision
871
895
  if self.variant:
872
896
  pipeline_kwargs["variant"] = self.variant
873
- if self.torch_dtype is not None:
874
- pipeline_kwargs["torch_dtype"] = self.torch_dtype
897
+ t2i_dtype = self._resolve_t2i_dtype() if self._user_specified_dtype is None else self.torch_dtype
898
+ if t2i_dtype is not None:
899
+ pipeline_kwargs["torch_dtype"] = t2i_dtype
875
900
 
876
901
  try:
877
902
  try:
@@ -923,11 +948,35 @@ class HorusProvider(BaseLLMProvider):
923
948
  with self._quiet_native_output():
924
949
  self.model = DiffusionPipeline.from_pretrained(base_repo_id, **pipeline_kwargs)
925
950
 
951
+ self._finalize_t2i_pipeline()
952
+ return self
953
+
954
+ def _finalize_t2i_pipeline(self) -> None:
955
+ """Post-load hardening shared by both standard and GGUF Lens paths.
956
+
957
+ 1. Move pipeline to self.device
958
+ 2. Upcast VAE to float32 to prevent decoding NaN (essential on float16 pipelines)
959
+ 3. Enable attention slicing for lower peak VRAM
960
+ 4. Suppress progress bars if requested
961
+ """
962
+ if self.model is None:
963
+ return
926
964
  if hasattr(self.model, "to"):
927
965
  self.model = self.model.to(self.device)
966
+ # Always keep VAE in float32 — ZImage VAE overflows in fp16/bf16 decoding
967
+ if hasattr(self.model, "vae") and self.model.vae is not None:
968
+ self.model.vae.to(dtype=torch.float32)
969
+ # Tell the pipeline to upcast latents before passing them to the VAE
970
+ if hasattr(self.model.vae, "config"):
971
+ self.model.vae.config.force_upcast = True
972
+ # Reduce peak VRAM by slicing attention — negligible speed impact
973
+ if hasattr(self.model, "enable_attention_slicing"):
974
+ try:
975
+ self.model.enable_attention_slicing()
976
+ except Exception:
977
+ pass
928
978
  if hasattr(self.model, "set_progress_bar_config") and self.suppress_native_output:
929
979
  self.model.set_progress_bar_config(disable=True)
930
- return self
931
980
 
932
981
  def _load_gguf(self) -> "HorusProvider":
933
982
  if not HF_HUB_AVAILABLE and self.auto_install_deps:
@@ -1559,6 +1608,21 @@ class HorusProvider(BaseLLMProvider):
1559
1608
  if not images:
1560
1609
  raise RuntimeError("Horus text-to-image generation did not return an image.")
1561
1610
  image = images[0]
1611
+
1612
+ # ── Black-image / NaN guard ─────────────────────────────────────
1613
+ try:
1614
+ import numpy as np
1615
+ arr = np.asarray(image)
1616
+ if arr.max() == 0:
1617
+ logger.warning(
1618
+ "Horus Lens generated an all-black image. This usually means the "
1619
+ "transformer produced NaN values due to float16 overflow. "
1620
+ "Try loading with torch_dtype='bfloat16' (Ampere+ GPUs) "
1621
+ "or torch_dtype='float32' (Tesla T4 / GTX 16xx)."
1622
+ )
1623
+ except Exception:
1624
+ pass
1625
+
1562
1626
  if output_path:
1563
1627
  path = Path(output_path)
1564
1628
  path.parent.mkdir(parents=True, exist_ok=True)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes