neuralnode 2.1.13__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.13 → neuralnode-2.1.14}/PKG-INFO +1 -1
  2. {neuralnode-2.1.13 → neuralnode-2.1.14}/pyproject.toml +1 -1
  3. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/horus.py +71 -15
  4. {neuralnode-2.1.13 → neuralnode-2.1.14}/.env.example +0 -0
  5. {neuralnode-2.1.13 → neuralnode-2.1.14}/.github/workflows/tests.yml +0 -0
  6. {neuralnode-2.1.13 → neuralnode-2.1.14}/Dockerfile +0 -0
  7. {neuralnode-2.1.13 → neuralnode-2.1.14}/LICENSE +0 -0
  8. {neuralnode-2.1.13 → neuralnode-2.1.14}/README.md +0 -0
  9. {neuralnode-2.1.13 → neuralnode-2.1.14}/docker-compose.yml +0 -0
  10. {neuralnode-2.1.13 → neuralnode-2.1.14}/docs/documentation.md +0 -0
  11. {neuralnode-2.1.13 → neuralnode-2.1.14}/docs/ecosystem_plan.md +0 -0
  12. {neuralnode-2.1.13 → neuralnode-2.1.14}/docs/replica_voice_ids.csv +0 -0
  13. {neuralnode-2.1.13 → neuralnode-2.1.14}/docs/replica_voice_ids.md +0 -0
  14. {neuralnode-2.1.13 → neuralnode-2.1.14}/docs/telegram_guide.md +0 -0
  15. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/agent_with_tools.py +0 -0
  16. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/basic_chat.py +0 -0
  17. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/01_basic_usage.py +0 -0
  18. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/02_horus_lens.py +0 -0
  19. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/03_one_liner.py +0 -0
  20. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/04_custom_cache.py +0 -0
  21. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/05_4bit_quantization.py +0 -0
  22. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/06_8bit_quantization.py +0 -0
  23. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/07_multi_gpu.py +0 -0
  24. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/08_flash_attention.py +0 -0
  25. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/09_data_types.py +0 -0
  26. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/10_generation_params.py +0 -0
  27. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/11_streaming.py +0 -0
  28. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/12_chat_templates.py +0 -0
  29. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/13_offline_mode.py +0 -0
  30. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/14_force_download.py +0 -0
  31. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/15_model_info.py +0 -0
  32. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/16_cpu_offloading.py +0 -0
  33. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/17_cpu_only.py +0 -0
  34. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/18_production_setup.py +0 -0
  35. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/19_gguf_4bit.py +0 -0
  36. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/20_gguf_5bit.py +0 -0
  37. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/21_gguf_6bit.py +0 -0
  38. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/22_gguf_8bit.py +0 -0
  39. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/23_gguf_16bit.py +0 -0
  40. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/24_list_models.py +0 -0
  41. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/25_interactive_chat.py +0 -0
  42. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_codes_camples/README.md +0 -0
  43. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_download_guide.py +0 -0
  44. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_examples.py +0 -0
  45. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_tq_ready_gguf.py +0 -0
  46. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/horus_transformers_features.py +0 -0
  47. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/local_models.py +0 -0
  48. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/neuralnode_v21_complete_demo.py +0 -0
  49. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/shade_model_with_tools.py +0 -0
  50. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/telegram_bot_demo.py +0 -0
  51. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/thinking_mode_example.py +0 -0
  52. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/tts_demo.py +0 -0
  53. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/turboquant_example.py +0 -0
  54. {neuralnode-2.1.13 → neuralnode-2.1.14}/examples/v3_features.py +0 -0
  55. {neuralnode-2.1.13 → neuralnode-2.1.14}/horus_chat_voice.py +0 -0
  56. {neuralnode-2.1.13 → neuralnode-2.1.14}/neuralnode_horus_replica_telegram.ipynb +0 -0
  57. {neuralnode-2.1.13 → neuralnode-2.1.14}/publish.bat +0 -0
  58. {neuralnode-2.1.13 → neuralnode-2.1.14}/publish.sh +0 -0
  59. {neuralnode-2.1.13 → neuralnode-2.1.14}/requirements_shade.txt +0 -0
  60. {neuralnode-2.1.13 → neuralnode-2.1.14}/scripts/setup.py +0 -0
  61. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/debug_import.py +0 -0
  62. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/__init__.py +0 -0
  63. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/agents/__init__.py +0 -0
  64. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/chains/__init__.py +0 -0
  65. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/config/__init__.py +0 -0
  66. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/core/__init__.py +0 -0
  67. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/core/openai_blocker.py +0 -0
  68. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/diagnostics/__init__.py +0 -0
  69. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/integrations/discord.py +0 -0
  70. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/integrations/slack.py +0 -0
  71. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/integrations/telegram.py +0 -0
  72. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/integrations/whatsapp.py +0 -0
  73. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/memory/__init__.py +0 -0
  74. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/memory/advanced.py +0 -0
  75. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/prompts/__init__.py +0 -0
  76. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/__init__.py +0 -0
  77. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/base.py +0 -0
  78. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/__init__.py +0 -0
  79. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/ai21.py +0 -0
  80. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/anthropic.py +0 -0
  81. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/cohere.py +0 -0
  82. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/deepseek.py +0 -0
  83. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/fireworks.py +0 -0
  84. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/google.py +0 -0
  85. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/groq.py +0 -0
  86. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/mistral.py +0 -0
  87. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/perplexity.py +0 -0
  88. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat/together.py +0 -0
  89. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/chat_models.py +0 -0
  90. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/embeddings.py +0 -0
  91. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/local/__init__.py +0 -0
  92. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/local_providers.py +0 -0
  93. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/text_generation.py +0 -0
  94. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/providers/universal_local.py +0 -0
  95. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/rag/__init__.py +0 -0
  96. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/rag/loaders.py +0 -0
  97. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/reasoning/__init__.py +0 -0
  98. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/replica.py +0 -0
  99. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/speech/__init__.py +0 -0
  100. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/thinking.py +0 -0
  101. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/__init__.py +0 -0
  102. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/advanced.py +0 -0
  103. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/multisearch.py +0 -0
  104. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/system/__init__.py +0 -0
  105. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/system/operations.py +0 -0
  106. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tools/web/__init__.py +0 -0
  107. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/tts/__init__.py +0 -0
  108. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/turboquant.py +0 -0
  109. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/utils/__init__.py +0 -0
  110. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/utils/dependencies.py +0 -0
  111. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/utils/logger.py +0 -0
  112. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/utils/metrics.py +0 -0
  113. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/vectorstores/__init__.py +0 -0
  114. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/neuralnode/vision/__init__.py +0 -0
  115. {neuralnode-2.1.13 → neuralnode-2.1.14}/src/nn/__init__.py +0 -0
  116. {neuralnode-2.1.13 → 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.13
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.13"
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
@@ -520,6 +521,24 @@ class HorusProvider(BaseLLMProvider):
520
521
  return mapping.get(torch_dtype.lower(), torch.float16)
521
522
  return torch_dtype
522
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
+
523
542
  @staticmethod
524
543
  def _is_gguf_model_id(model_id: str) -> bool:
525
544
  return model_id.lower().endswith(".gguf")
@@ -640,8 +659,12 @@ class HorusProvider(BaseLLMProvider):
640
659
  pipeline_kwargs["revision"] = self.revision
641
660
  if self.variant:
642
661
  pipeline_kwargs["variant"] = self.variant
643
- if self.torch_dtype is not None:
644
- 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
645
668
 
646
669
  try:
647
670
  # Check if this model is Horus-Lens-1.0 which requires custom component mapping
@@ -701,13 +724,7 @@ class HorusProvider(BaseLLMProvider):
701
724
  "Only public Hugging Face repositories are supported."
702
725
  ) from exc
703
726
 
704
- if hasattr(self.model, "to"):
705
- self.model = self.model.to(self.device)
706
- if hasattr(self.model, "vae") and self.model.vae is not None:
707
- if self.device == "cuda" and self.torch_dtype == torch.float16:
708
- self.model.vae.to(dtype=torch.float32)
709
- if hasattr(self.model, "set_progress_bar_config") and self.suppress_native_output:
710
- self.model.set_progress_bar_config(disable=True)
727
+ self._finalize_t2i_pipeline()
711
728
  return self
712
729
 
713
730
  def _load_gguf_text_to_image(self) -> "HorusProvider":
@@ -818,7 +835,9 @@ class HorusProvider(BaseLLMProvider):
818
835
  except ImportError:
819
836
  GGUFQuantizationConfig = None
820
837
 
821
- 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
822
841
 
823
842
  transformer_kwargs = {
824
843
  "torch_dtype": compute_dtype,
@@ -875,8 +894,9 @@ class HorusProvider(BaseLLMProvider):
875
894
  pipeline_kwargs["revision"] = self.revision
876
895
  if self.variant:
877
896
  pipeline_kwargs["variant"] = self.variant
878
- if self.torch_dtype is not None:
879
- 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
880
900
 
881
901
  try:
882
902
  try:
@@ -928,14 +948,35 @@ class HorusProvider(BaseLLMProvider):
928
948
  with self._quiet_native_output():
929
949
  self.model = DiffusionPipeline.from_pretrained(base_repo_id, **pipeline_kwargs)
930
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
931
964
  if hasattr(self.model, "to"):
932
965
  self.model = self.model.to(self.device)
966
+ # Always keep VAE in float32 — ZImage VAE overflows in fp16/bf16 decoding
933
967
  if hasattr(self.model, "vae") and self.model.vae is not None:
934
- if self.device == "cuda" and self.torch_dtype == torch.float16:
935
- self.model.vae.to(dtype=torch.float32)
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
936
978
  if hasattr(self.model, "set_progress_bar_config") and self.suppress_native_output:
937
979
  self.model.set_progress_bar_config(disable=True)
938
- return self
939
980
 
940
981
  def _load_gguf(self) -> "HorusProvider":
941
982
  if not HF_HUB_AVAILABLE and self.auto_install_deps:
@@ -1567,6 +1608,21 @@ class HorusProvider(BaseLLMProvider):
1567
1608
  if not images:
1568
1609
  raise RuntimeError("Horus text-to-image generation did not return an image.")
1569
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
+
1570
1626
  if output_path:
1571
1627
  path = Path(output_path)
1572
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