neuralnode 2.2.8__tar.gz → 2.2.9__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 (162) hide show
  1. {neuralnode-2.2.8 → neuralnode-2.2.9}/.env.example +0 -13
  2. {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/workflows/tests.yml +1 -1
  3. {neuralnode-2.2.8 → neuralnode-2.2.9}/.gitignore +4 -1
  4. neuralnode-2.2.9/CHANGELOG.md +89 -0
  5. {neuralnode-2.2.8 → neuralnode-2.2.9}/PKG-INFO +36 -59
  6. {neuralnode-2.2.8 → neuralnode-2.2.9}/README.md +31 -49
  7. {neuralnode-2.2.8 → neuralnode-2.2.9}/pyproject.toml +5 -15
  8. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/__init__.py +11 -39
  9. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/core/__init__.py +8 -1
  10. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/__init__.py +0 -3
  11. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/openclaw.py +46 -13
  12. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/__init__.py +0 -11
  13. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/__init__.py +0 -10
  14. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/embeddings.py +19 -13
  15. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/local_providers.py +98 -27
  16. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_providers_mocked.py +82 -0
  17. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_release_readiness.py +2 -5
  18. neuralnode-2.2.8/.ci-dist/neuralnode-2.2.8-py3-none-any.whl +0 -0
  19. neuralnode-2.2.8/.ci-dist/neuralnode-2.2.8.tar.gz +0 -0
  20. neuralnode-2.2.8/Dockerfile +0 -44
  21. neuralnode-2.2.8/docker-compose.yml +0 -74
  22. neuralnode-2.2.8/docs/ecosystem_plan.md +0 -482
  23. neuralnode-2.2.8/docs/model_api.md +0 -76
  24. neuralnode-2.2.8/examples/horus_cyber_nano_agent_mode.py +0 -67
  25. neuralnode-2.2.8/examples/horus_cyber_nano_early_access.py +0 -22
  26. neuralnode-2.2.8/examples/whatsapp_bot_demo.py +0 -2
  27. neuralnode-2.2.8/horus_chat_voice.py +0 -61
  28. neuralnode-2.2.8/neuralnode_horus_replica_telegram.ipynb +0 -405
  29. neuralnode-2.2.8/publish.bat +0 -71
  30. neuralnode-2.2.8/publish.sh +0 -68
  31. neuralnode-2.2.8/requirements_shade.txt +0 -40
  32. neuralnode-2.2.8/scripts/setup.py +0 -127
  33. neuralnode-2.2.8/src/debug_import.py +0 -37
  34. neuralnode-2.2.8/src/neuralnode/api.py +0 -341
  35. neuralnode-2.2.8/src/neuralnode/integrations/whatsapp.py +0 -99
  36. neuralnode-2.2.8/src/neuralnode/providers/chat/h_preview.py +0 -113
  37. neuralnode-2.2.8/src/neuralnode/providers/chat/horus_cyber_nano.py +0 -375
  38. neuralnode-2.2.8/tests/test_horus_cyber_nano_api.py +0 -222
  39. {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  40. {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/workflows/publish.yml +0 -0
  41. {neuralnode-2.2.8 → neuralnode-2.2.9}/CONTRIBUTING.md +0 -0
  42. {neuralnode-2.2.8 → neuralnode-2.2.9}/LICENSE +0 -0
  43. {neuralnode-2.2.8 → neuralnode-2.2.9}/NOTICE +0 -0
  44. {neuralnode-2.2.8 → neuralnode-2.2.9}/THIRD_PARTY_NOTICES.md +0 -0
  45. {neuralnode-2.2.8 → neuralnode-2.2.9}/TOKENAI_CLA.md +0 -0
  46. {neuralnode-2.2.8 → neuralnode-2.2.9}/TRADEMARKS.md +0 -0
  47. {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/assets/neuralnode-logo-transparent.png +0 -0
  48. {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/documentation.md +0 -0
  49. {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/replica_voice_ids.csv +0 -0
  50. {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/replica_voice_ids.md +0 -0
  51. {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/telegram_guide.md +0 -0
  52. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/agent_with_tools.py +0 -0
  53. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/basic_chat.py +0 -0
  54. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/01_basic_usage.py +0 -0
  55. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/02_horus_lens.py +0 -0
  56. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/03_one_liner.py +0 -0
  57. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/04_custom_cache.py +0 -0
  58. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/05_4bit_quantization.py +0 -0
  59. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/06_8bit_quantization.py +0 -0
  60. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/07_multi_gpu.py +0 -0
  61. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/08_flash_attention.py +0 -0
  62. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/09_data_types.py +0 -0
  63. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/10_generation_params.py +0 -0
  64. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/11_streaming.py +0 -0
  65. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/12_chat_templates.py +0 -0
  66. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/13_offline_mode.py +0 -0
  67. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/14_force_download.py +0 -0
  68. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/15_model_info.py +0 -0
  69. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/16_cpu_offloading.py +0 -0
  70. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/17_cpu_only.py +0 -0
  71. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/18_production_setup.py +0 -0
  72. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/19_gguf_4bit.py +0 -0
  73. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/20_gguf_5bit.py +0 -0
  74. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/21_gguf_6bit.py +0 -0
  75. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/22_gguf_8bit.py +0 -0
  76. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/23_gguf_16bit.py +0 -0
  77. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/24_list_models.py +0 -0
  78. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/25_interactive_chat.py +0 -0
  79. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/26_horus_hiero.py +0 -0
  80. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/README.md +0 -0
  81. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_download_guide.py +0 -0
  82. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_examples.py +0 -0
  83. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_tq_ready_gguf.py +0 -0
  84. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_transformers_features.py +0 -0
  85. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/local_models.py +0 -0
  86. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/neuralnode_v21_complete_demo.py +0 -0
  87. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/openclaw_demo.py +0 -0
  88. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/shade_model_with_tools.py +0 -0
  89. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/telegram_bot_demo.py +0 -0
  90. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/thinking_mode_example.py +0 -0
  91. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/tts_demo.py +0 -0
  92. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/turboquant_example.py +0 -0
  93. {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/v3_features.py +0 -0
  94. {neuralnode-2.2.8 → neuralnode-2.2.9}/media/neuralnode.png +0 -0
  95. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/__init__.py +0 -0
  96. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/agents.py +0 -0
  97. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/base.py +0 -0
  98. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/thinking.py +0 -0
  99. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/chains/__init__.py +0 -0
  100. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/config/__init__.py +0 -0
  101. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/core/openai_blocker.py +0 -0
  102. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/diagnostics/__init__.py +0 -0
  103. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/discord.py +0 -0
  104. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/slack.py +0 -0
  105. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/telegram.py +0 -0
  106. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/__init__.py +0 -0
  107. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/advanced.py +0 -0
  108. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/conversation.py +0 -0
  109. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/file.py +0 -0
  110. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/sliding.py +0 -0
  111. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/summary.py +0 -0
  112. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/prompts/__init__.py +0 -0
  113. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/base.py +0 -0
  114. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/ai21.py +0 -0
  115. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/anthropic.py +0 -0
  116. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/bedrock.py +0 -0
  117. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/cohere.py +0 -0
  118. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/deepseek.py +0 -0
  119. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/fireworks.py +0 -0
  120. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/google.py +0 -0
  121. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/groq.py +0 -0
  122. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/mistral.py +0 -0
  123. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/openai.py +0 -0
  124. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/perplexity.py +0 -0
  125. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/together.py +0 -0
  126. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/vertex.py +0 -0
  127. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/hfhub.py +0 -0
  128. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/horus.py +0 -0
  129. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/image_generation.py +0 -0
  130. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/local/__init__.py +0 -0
  131. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/text_generation.py +0 -0
  132. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/universal_local.py +0 -0
  133. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/rag/__init__.py +0 -0
  134. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/reasoning/__init__.py +0 -0
  135. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/replica.py +0 -0
  136. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/speech/__init__.py +0 -0
  137. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/thinking.py +0 -0
  138. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/__init__.py +0 -0
  139. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/advanced.py +0 -0
  140. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/multisearch.py +0 -0
  141. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/system/__init__.py +0 -0
  142. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/system/operations.py +0 -0
  143. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/web/__init__.py +0 -0
  144. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tts/__init__.py +0 -0
  145. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/turboquant.py +0 -0
  146. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/__init__.py +0 -0
  147. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/dependencies.py +0 -0
  148. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/logger.py +0 -0
  149. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/metrics.py +0 -0
  150. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/vectorstores/__init__.py +0 -0
  151. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/vision/__init__.py +0 -0
  152. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/voice.py +0 -0
  153. {neuralnode-2.2.8 → neuralnode-2.2.9}/src/nn/__init__.py +0 -0
  154. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_agents_basic.py +0 -0
  155. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_hfhub.py +0 -0
  156. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_image_generation.py +0 -0
  157. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_memory.py +0 -0
  158. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_openclaw.py +0 -0
  159. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_provider_capabilities.py +0 -0
  160. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_rag.py +0 -0
  161. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_refactoring.py +0 -0
  162. {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_voice.py +0 -0
@@ -15,19 +15,6 @@ GOOGLE_API_KEY=your-google-api-key-here
15
15
  # No API key needed, just ensure Ollama is running
16
16
  OLLAMA_BASE_URL=http://localhost:11434
17
17
 
18
- # Horus Cyber Nano 1.0 BETA Early Access
19
- HORUS_CYBER_NANO_API_KEY=horusNN-your-access-token
20
- HORUS_CYBER_NANO_BASE_URL=https://api.tokenai.llc/v1
21
-
22
- # NeuralNode H-Preview API Gateway
23
- NEURALNODE_API_DB=neuralnode-api.sqlite3
24
- NEURALNODE_API_KEY=nn-your-24-character-token
25
- NEURALNODE_API_BASE_URL=http://127.0.0.1:8000/v1
26
- H_PREVIEW_UPSTREAM_URL=http://127.0.0.1:8001/v1
27
- H_PREVIEW_UPSTREAM_MODEL=DavidAU/Qwen3.8-27B-TURBO-Fable-Cold-Fusion-735-882-Heretic-Uncensored-NM-DAU
28
- # Optional: only set this when the remote model server requires an API key.
29
- # H_PREVIEW_UPSTREAM_API_KEY=
30
-
31
18
  # NeuralNode Settings
32
19
  NEURALNODE_DEFAULT_PROVIDER=auto
33
20
  NEURALNODE_MEMORY_ENABLED=true
@@ -29,7 +29,7 @@ jobs:
29
29
  - name: Install wheel and verify package version
30
30
  run: |
31
31
  python -m pip install --force-reinstall .ci-dist/*.whl
32
- python -c "import neuralnode; assert neuralnode.__version__ == '2.2.8'; print(neuralnode.__version__)"
32
+ python -c "import neuralnode; assert neuralnode.__version__ == '2.2.9'; print(neuralnode.__version__)"
33
33
 
34
34
  test:
35
35
  # Python 3.9 is no longer available on the newest Ubuntu runner image.
@@ -6,6 +6,10 @@ __pycache__/
6
6
  *.egg-info/
7
7
  dist/
8
8
  release-dist/
9
+ .release-dist*/
10
+ .ci-dist/
11
+ .ci-dist-verify*/
12
+ .install-check*/
9
13
  build/
10
14
  .eggs/
11
15
 
@@ -23,7 +27,6 @@ env/
23
27
  !**/.env.example
24
28
 
25
29
  # Temp / outputs
26
- temp_header.gguf
27
30
  outputs/
28
31
  .tmp_*
29
32
  *.gguf.tmp
@@ -0,0 +1,89 @@
1
+ # Changelog
2
+
3
+ All notable changes to NeuralNode are documented here.
4
+
5
+ ## 2.2.9 — 2026-11-01
6
+
7
+ ### Integrations and runtime cleanup
8
+
9
+ - Removed the deprecated WhatsApp/Twilio integration and legacy API gateway.
10
+ - Removed obsolete provider and deployment artifacts from the maintained core.
11
+ - Updated the OpenClaw manager for the current OpenClaw configuration schema,
12
+ loopback-only gateway binding, token authentication, and OpenAI-compatible
13
+ chat-completions enablement.
14
+ - Added a blocking-chat fallback for OpenClaw streaming requests so providers
15
+ without native streaming can still complete gateway turns.
16
+ - Validated the NeuralNode → OpenClaw → local Qwen/llama.cpp path on AWS.
17
+ - Upgraded Ollama chat integration to the native `/api/chat` protocol with
18
+ role-preserving messages, streaming, structured output, and tool calls.
19
+ - Added Ollama native reasoning control through `thinking=True` or
20
+ `thinking=False`, preserving the model trace in response metadata.
21
+ - Updated Ollama embeddings to the batch `/api/embed` endpoint with a legacy
22
+ compatibility fallback.
23
+ - Removed the remaining Twilio optional dependency with the retired WhatsApp
24
+ integration.
25
+
26
+ ## 2.2.8 — 2026-11-01
27
+
28
+ NeuralNode 2.2.8 is a feature and reliability release focused on local model
29
+ execution, multimodal workflows, integrations, and reproducible packaging.
30
+
31
+ ### Multimodal and local model support
32
+
33
+ - Added local Hugging Face speech adapters:
34
+ - `HuggingFaceSTT` for audio transcription.
35
+ - `HuggingFaceTTS` for text-to-speech generation.
36
+ - Added configurable Hugging Face model IDs, lazy loading, language handling,
37
+ CPU/CUDA device selection, and WAV output for the speech adapters.
38
+ - Added local vision-language input support through the existing image chat
39
+ interface.
40
+ - Added Diffusers-compatible local text-to-image loading and generation.
41
+ - Improved local model generation determinism and provider identity.
42
+ - Improved model repository download handling for Hugging Face sources.
43
+ - Added explicit authentication support for private and gated Hugging Face
44
+ repositories using `HF_TOKEN` or an explicit token parameter.
45
+ - Made optional Horus runtime imports tolerant of environments where the heavy
46
+ local ML dependencies are not installed.
47
+
48
+ ### Voice workflows
49
+
50
+ - Added a sequential `VoiceAgent` pipeline for file-based and push-to-talk
51
+ interactions:
52
+
53
+ `audio input → speech-to-text → agent/LLM turn → text-to-speech → audio output`
54
+
55
+ - Added HTTP speech adapters for connecting external STT and TTS services.
56
+ - Documented the distinction between sequential voice turns and low-latency,
57
+ full-duplex live audio. Full-duplex streaming is outside this release.
58
+
59
+ ### Agents and tools
60
+
61
+ - Improved provider-backed agent tool calling.
62
+ - Added support for textual actions from tool-capable models.
63
+ - Improved tool-result message handling and buffered streaming compatibility.
64
+ - Preserved the existing agents, memory, RAG, embeddings, vector-store, and
65
+ integration APIs.
66
+
67
+ ### Horus and OpenClaw
68
+
69
+ - Aligned Horus and OpenClaw integrations with the current public interfaces.
70
+ - Secured the OpenClaw local API behavior.
71
+ - Added test paths that do not require optional OpenClaw HTTP test packages.
72
+ ### Release engineering
73
+
74
+ - Added source distribution and wheel build validation in CI.
75
+ - Isolated package build output from repository working files.
76
+ - Added trusted PyPI publishing through GitHub Actions and PyPI's OIDC
77
+ trusted-publishing flow.
78
+ - Added public repository, ownership, license, and release metadata alignment.
79
+
80
+ ### Compatibility and limitations
81
+
82
+ - Python 3.9, 3.10, 3.11, and 3.12 are supported by the package metadata.
83
+ - Heavy local-model, image, and speech features remain optional extras; the
84
+ base installation does not install those large runtime dependencies.
85
+ - Public Hugging Face models can be loaded without a token. Private or gated
86
+ repositories require a valid `HF_TOKEN`.
87
+ - The voice pipeline in this release processes one turn at a time. It is not a
88
+ real-time, full-duplex audio session.
89
+
@@ -1,14 +1,15 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: neuralnode
3
- Version: 2.2.8
3
+ Version: 2.2.9
4
4
  Summary: Connect models. Build AI. A Python framework for LLM providers, agents, memory, RAG, and tools.
5
- Project-URL: Homepage, https://assem.cloud/
5
+ Project-URL: Homepage, https://tokenai.llc/
6
+ Project-URL: NeuralNode, https://tokenai.llc/
6
7
  Project-URL: Documentation, https://neuralnode.readthedocs.io
7
8
  Project-URL: Repository, https://github.com/tokenaillc/neuralnode
8
9
  Project-URL: Issues, https://github.com/tokenaillc/neuralnode/issues
9
10
  Project-URL: Changelog, https://github.com/tokenaillc/neuralnode/blob/main/CHANGELOG.md
10
- Author-email: Assem Sabry <assemsabryy@outlook.com>
11
- Maintainer-email: Assem Sabry <assemsabryy@outlook.com>
11
+ Author-email: Assem Sabry <assemsabry777@gmail.com>
12
+ Maintainer-email: Assem Sabry <assemsabry777@gmail.com>
12
13
  License: TokenAI Source-Available License
13
14
  Version 1.0
14
15
 
@@ -217,13 +218,9 @@ Requires-Dist: speechrecognition>=3.10.0; extra == 'all'
217
218
  Requires-Dist: sqlalchemy>=2.0.0; extra == 'all'
218
219
  Requires-Dist: torch>=2.0.0; extra == 'all'
219
220
  Requires-Dist: transformers>=4.35.0; extra == 'all'
220
- Requires-Dist: twilio>=9.0.0; extra == 'all'
221
221
  Requires-Dist: uvicorn>=0.27.0; extra == 'all'
222
222
  Provides-Extra: anthropic
223
223
  Requires-Dist: anthropic>=0.8.0; extra == 'anthropic'
224
- Provides-Extra: api
225
- Requires-Dist: fastapi>=0.110.0; extra == 'api'
226
- Requires-Dist: uvicorn>=0.27.0; extra == 'api'
227
224
  Provides-Extra: aws
228
225
  Requires-Dist: boto3>=1.34.0; extra == 'aws'
229
226
  Provides-Extra: azure
@@ -351,12 +348,10 @@ Provides-Extra: vision
351
348
  Requires-Dist: pillow>=9.0; extra == 'vision'
352
349
  Provides-Extra: weaviate
353
350
  Requires-Dist: weaviate-client>=3.0.0; extra == 'weaviate'
354
- Provides-Extra: whatsapp
355
- Requires-Dist: twilio>=9.0.0; extra == 'whatsapp'
356
351
  Description-Content-Type: text/markdown
357
352
 
358
353
  <p align="center">
359
- <img src="media/neuralnode.png" alt="NeuralNode — Connect models. Build AI." width="720">
354
+ <img src="https://raw.githubusercontent.com/tokenaillc/neuralnode/v2.2.8/media/neuralnode.png" alt="NeuralNode — Connect models. Build AI." width="720">
360
355
  </p>
361
356
 
362
357
  <p align="center">
@@ -375,6 +370,32 @@ one consistent interface. Build applications with model providers, agents,
375
370
  tools, memory, RAG, embeddings, vector stores, and integrations without
376
371
  rewriting your application around a single provider.
377
372
 
373
+ ## What's new in 2.2.8
374
+
375
+ NeuralNode 2.2.8 expands the framework's local-model and multimodal building
376
+ blocks while making the public release safer to build and publish.
377
+
378
+ - Added Hugging Face authentication support for public, private, and gated
379
+ model repositories through the `HF_TOKEN` environment variable or an
380
+ explicit token argument.
381
+ - Added local Hugging Face speech adapters for speech-to-text and text-to-speech,
382
+ including lazy loading, automatic CPU/CUDA selection, configurable model IDs,
383
+ language handling, and WAV output.
384
+ - Added a sequential `VoiceAgent` workflow that connects audio transcription,
385
+ an agent turn, and speech synthesis for file-based and push-to-talk use cases.
386
+ - Added local vision-language input and Diffusers-compatible text-to-image
387
+ generation through dedicated Hugging Face model loaders.
388
+ - Improved Horus model loading, provider identity, deterministic generation,
389
+ optional runtime imports, and model repository download behavior.
390
+ - Improved provider-backed agent tool calling, including textual actions and
391
+ tool-result handling.
392
+ - Added and aligned OpenClaw integration behavior, including safer local API
393
+ access and test coverage that does not require optional HTTP test packages.
394
+ - Hardened the release pipeline with source and wheel build validation,
395
+ isolated build output, and trusted publishing to PyPI through GitHub Actions.
396
+
397
+ For the complete release record, see [CHANGELOG.md](CHANGELOG.md).
398
+
378
399
  ## Why NeuralNode?
379
400
 
380
401
  - **One interface for many models** — connect cloud APIs, local runtimes, and
@@ -506,49 +527,6 @@ environment. `HuggingFaceTTS.speak()` writes mono PCM WAV output.
506
527
 
507
528
  ## Horus
508
529
 
509
- ### H-Preview Model API
510
-
511
- NeuralNode includes an OpenAI-compatible API gateway for serving H-Preview through a vLLM-compatible server on another machine. The gateway creates `nn-` access tokens with `Basic` (RPM controlled) and `Elite` (no application RPM accounting) tiers, plus one owner admin token for managing them. See [docs/model_api.md](docs/model_api.md) for deployment and Python client examples.
512
-
513
- ```python
514
- import neuralnode as nn
515
-
516
- ai = nn.NeuralNode(
517
- provider="h-preview",
518
- model="h-preview",
519
- api_key="nn-...",
520
- base_url="https://api.example.com/v1",
521
- )
522
- print(ai.chat("Say hello."))
523
- ```
524
-
525
- ### Horus Cyber Nano 1.0 Early Access API
526
-
527
- Horus Cyber Nano 1.0 is a Text-to-Text model. The hosted API is currently in Early Access. Approved users can call it through the same
528
- `NeuralNode` interface. Each Access Token has its own server-enforced RPM limit,
529
- and API conversations are retained by TokenAI under the Early Access terms.
530
-
531
- ```python
532
- import neuralnode as nn
533
-
534
- ai = nn.NeuralNode(
535
- provider="horus-cyber-nano",
536
- model="horus-cyber-nano-1.0-beta",
537
- api_key="horusNN-XXXXXXXXXXXXXXXX",
538
- )
539
-
540
- print(ai.chat("Review this code for defensive cybersecurity issues."))
541
- ```
542
-
543
- The client reads `HORUS_CYBER_NANO_API_KEY` automatically. Override
544
- `HORUS_CYBER_NANO_BASE_URL` only when TokenAI provides a different API endpoint.
545
- The production API base URL is `https://api.tokenai.llc/v1`. Agent Mode supports
546
- function tools, required or named tool choices, tool-result messages, and
547
- buffered SSE compatibility streams. The hosted Early Access model has a 32,768
548
- token context. See `examples/horus_cyber_nano_agent_mode.py` for the complete
549
- tool-call round trip. NeuralNode retries temporary HTTP 429, 502, and 503
550
- responses up to two times by default and respects the API Retry-After header.
551
-
552
530
  Locally loaded Horus models use:
553
531
  - unified chat template: `horus_unified`
554
532
  - unified context window: `8192`
@@ -766,7 +744,7 @@ If the `turboquant` package is not installed or the backend cannot use it, Neura
766
744
 
767
745
  ## Notes
768
746
 
769
- - OpenAI-compatible providers are fully supported (OpenAI, OpenRouter, AgentRouter, H-Preview, etc.).
747
+ - OpenAI-compatible providers are fully supported (OpenAI, OpenRouter, and AgentRouter).
770
748
  - GGUF Horus models require `llama-cpp-python`.
771
749
  - Horus downloads from Hugging Face require `huggingface_hub`.
772
750
 
@@ -784,13 +762,12 @@ per-instance token automatically and configures its local server to require it.
784
762
  `send_task`; OpenClaw disables this endpoint by default. A stable `session_id` is sent
785
763
  as the OpenAI `user` value, so the Gateway creates or resumes that conversation when
786
764
  the first message is sent. OpenClaw session status/control uses its WebSocket RPC API
787
- and is not implemented by this HTTP client. Messaging channels such as WhatsApp must
788
- be configured and authorized in OpenClaw itself.
765
+ and is not implemented by this HTTP client.
789
766
 
790
767
  ## Links
791
768
 
792
- - **TokenAI**: [https://tokenai.cloud/](https://tokenai.cloud/)
793
- - **NeuralNode**: [https://neuralnode.tokenai.cloud/](https://neuralnode.tokenai.cloud/)
769
+ - **TokenAI**: [https://tokenai.llc/](https://tokenai.llc/)
770
+ - **NeuralNode**: [https://tokenai.llc/](https://tokenai.llc/)
794
771
 
795
772
  ## License and ownership
796
773
 
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="media/neuralnode.png" alt="NeuralNode — Connect models. Build AI." width="720">
2
+ <img src="https://raw.githubusercontent.com/tokenaillc/neuralnode/v2.2.8/media/neuralnode.png" alt="NeuralNode — Connect models. Build AI." width="720">
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -18,6 +18,32 @@ one consistent interface. Build applications with model providers, agents,
18
18
  tools, memory, RAG, embeddings, vector stores, and integrations without
19
19
  rewriting your application around a single provider.
20
20
 
21
+ ## What's new in 2.2.8
22
+
23
+ NeuralNode 2.2.8 expands the framework's local-model and multimodal building
24
+ blocks while making the public release safer to build and publish.
25
+
26
+ - Added Hugging Face authentication support for public, private, and gated
27
+ model repositories through the `HF_TOKEN` environment variable or an
28
+ explicit token argument.
29
+ - Added local Hugging Face speech adapters for speech-to-text and text-to-speech,
30
+ including lazy loading, automatic CPU/CUDA selection, configurable model IDs,
31
+ language handling, and WAV output.
32
+ - Added a sequential `VoiceAgent` workflow that connects audio transcription,
33
+ an agent turn, and speech synthesis for file-based and push-to-talk use cases.
34
+ - Added local vision-language input and Diffusers-compatible text-to-image
35
+ generation through dedicated Hugging Face model loaders.
36
+ - Improved Horus model loading, provider identity, deterministic generation,
37
+ optional runtime imports, and model repository download behavior.
38
+ - Improved provider-backed agent tool calling, including textual actions and
39
+ tool-result handling.
40
+ - Added and aligned OpenClaw integration behavior, including safer local API
41
+ access and test coverage that does not require optional HTTP test packages.
42
+ - Hardened the release pipeline with source and wheel build validation,
43
+ isolated build output, and trusted publishing to PyPI through GitHub Actions.
44
+
45
+ For the complete release record, see [CHANGELOG.md](CHANGELOG.md).
46
+
21
47
  ## Why NeuralNode?
22
48
 
23
49
  - **One interface for many models** — connect cloud APIs, local runtimes, and
@@ -149,49 +175,6 @@ environment. `HuggingFaceTTS.speak()` writes mono PCM WAV output.
149
175
 
150
176
  ## Horus
151
177
 
152
- ### H-Preview Model API
153
-
154
- NeuralNode includes an OpenAI-compatible API gateway for serving H-Preview through a vLLM-compatible server on another machine. The gateway creates `nn-` access tokens with `Basic` (RPM controlled) and `Elite` (no application RPM accounting) tiers, plus one owner admin token for managing them. See [docs/model_api.md](docs/model_api.md) for deployment and Python client examples.
155
-
156
- ```python
157
- import neuralnode as nn
158
-
159
- ai = nn.NeuralNode(
160
- provider="h-preview",
161
- model="h-preview",
162
- api_key="nn-...",
163
- base_url="https://api.example.com/v1",
164
- )
165
- print(ai.chat("Say hello."))
166
- ```
167
-
168
- ### Horus Cyber Nano 1.0 Early Access API
169
-
170
- Horus Cyber Nano 1.0 is a Text-to-Text model. The hosted API is currently in Early Access. Approved users can call it through the same
171
- `NeuralNode` interface. Each Access Token has its own server-enforced RPM limit,
172
- and API conversations are retained by TokenAI under the Early Access terms.
173
-
174
- ```python
175
- import neuralnode as nn
176
-
177
- ai = nn.NeuralNode(
178
- provider="horus-cyber-nano",
179
- model="horus-cyber-nano-1.0-beta",
180
- api_key="horusNN-XXXXXXXXXXXXXXXX",
181
- )
182
-
183
- print(ai.chat("Review this code for defensive cybersecurity issues."))
184
- ```
185
-
186
- The client reads `HORUS_CYBER_NANO_API_KEY` automatically. Override
187
- `HORUS_CYBER_NANO_BASE_URL` only when TokenAI provides a different API endpoint.
188
- The production API base URL is `https://api.tokenai.llc/v1`. Agent Mode supports
189
- function tools, required or named tool choices, tool-result messages, and
190
- buffered SSE compatibility streams. The hosted Early Access model has a 32,768
191
- token context. See `examples/horus_cyber_nano_agent_mode.py` for the complete
192
- tool-call round trip. NeuralNode retries temporary HTTP 429, 502, and 503
193
- responses up to two times by default and respects the API Retry-After header.
194
-
195
178
  Locally loaded Horus models use:
196
179
  - unified chat template: `horus_unified`
197
180
  - unified context window: `8192`
@@ -409,7 +392,7 @@ If the `turboquant` package is not installed or the backend cannot use it, Neura
409
392
 
410
393
  ## Notes
411
394
 
412
- - OpenAI-compatible providers are fully supported (OpenAI, OpenRouter, AgentRouter, H-Preview, etc.).
395
+ - OpenAI-compatible providers are fully supported (OpenAI, OpenRouter, and AgentRouter).
413
396
  - GGUF Horus models require `llama-cpp-python`.
414
397
  - Horus downloads from Hugging Face require `huggingface_hub`.
415
398
 
@@ -427,13 +410,12 @@ per-instance token automatically and configures its local server to require it.
427
410
  `send_task`; OpenClaw disables this endpoint by default. A stable `session_id` is sent
428
411
  as the OpenAI `user` value, so the Gateway creates or resumes that conversation when
429
412
  the first message is sent. OpenClaw session status/control uses its WebSocket RPC API
430
- and is not implemented by this HTTP client. Messaging channels such as WhatsApp must
431
- be configured and authorized in OpenClaw itself.
413
+ and is not implemented by this HTTP client.
432
414
 
433
415
  ## Links
434
416
 
435
- - **TokenAI**: [https://tokenai.cloud/](https://tokenai.cloud/)
436
- - **NeuralNode**: [https://neuralnode.tokenai.cloud/](https://neuralnode.tokenai.cloud/)
417
+ - **TokenAI**: [https://tokenai.llc/](https://tokenai.llc/)
418
+ - **NeuralNode**: [https://tokenai.llc/](https://tokenai.llc/)
437
419
 
438
420
  ## License and ownership
439
421
 
@@ -4,17 +4,17 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "neuralnode"
7
- version = "2.2.8"
7
+ version = "2.2.9"
8
8
  description = "Connect models. Build AI. A Python framework for LLM providers, agents, memory, RAG, and tools."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
11
11
  license = {file = "LICENSE"}
12
12
  keywords = ["llm", "ai", "agent", "framework", "openai", "anthropic", "google", "ollama", "langchain", "rag", "tools", "automation", "embeddings", "vector-stores"]
13
13
  authors = [
14
- {name = "Assem Sabry", email = "assemsabryy@outlook.com"}
14
+ {name = "Assem Sabry", email = "assemsabry777@gmail.com"}
15
15
  ]
16
16
  maintainers = [
17
- {name = "Assem Sabry", email = "assemsabryy@outlook.com"}
17
+ {name = "Assem Sabry", email = "assemsabry777@gmail.com"}
18
18
  ]
19
19
  classifiers = [
20
20
  "Development Status :: 4 - Beta",
@@ -169,15 +169,10 @@ telegram = [
169
169
  ]
170
170
  discord = ["discord.py>=2.3.0"]
171
171
  slack = ["slack-sdk>=3.21.0"]
172
- whatsapp = ["twilio>=9.0.0"]
173
172
  openclaw = [
174
173
  "fastapi>=0.110.0",
175
174
  "uvicorn>=0.27.0",
176
175
  ]
177
- api = [
178
- "fastapi>=0.110.0",
179
- "uvicorn>=0.27.0",
180
- ]
181
176
 
182
177
  # All features
183
178
  all = [
@@ -202,7 +197,6 @@ all = [
202
197
  "einops>=0.7.0",
203
198
  "sentence-transformers>=2.2.0",
204
199
  "python-telegram-bot>=20.0",
205
- "twilio>=9.0.0",
206
200
  "fastapi>=0.110.0",
207
201
  "uvicorn>=0.27.0",
208
202
  "edge-tts>=6.1.0",
@@ -228,15 +222,13 @@ dev = [
228
222
  ]
229
223
 
230
224
  [project.urls]
231
- Homepage = "https://assem.cloud/"
225
+ Homepage = "https://tokenai.llc/"
226
+ NeuralNode = "https://tokenai.llc/"
232
227
  Documentation = "https://neuralnode.readthedocs.io"
233
228
  Repository = "https://github.com/tokenaillc/neuralnode"
234
229
  Issues = "https://github.com/tokenaillc/neuralnode/issues"
235
230
  Changelog = "https://github.com/tokenaillc/neuralnode/blob/main/CHANGELOG.md"
236
231
 
237
- [project.scripts]
238
- neuralnode-api = "neuralnode.api:main"
239
-
240
232
  [tool.hatch.build.targets.wheel]
241
233
  packages = ["src/neuralnode"]
242
234
  exclude = [
@@ -251,11 +243,9 @@ exclude = [
251
243
  "/.tmp_*",
252
244
  "/actionlint.zip",
253
245
  "/actionlint_bin",
254
- "/deployment",
255
246
  "/dist",
256
247
  "/dist_*",
257
248
  "/outputs",
258
- "/temp_header.gguf",
259
249
  "**/__pycache__/**",
260
250
  "**/*.pyc",
261
251
  ]
@@ -42,7 +42,7 @@ Quick Start::
42
42
  text = sr.listen()
43
43
  """
44
44
 
45
- __version__ = "2.2.8"
45
+ __version__ = "2.2.9"
46
46
  __author__ = "NeuralNode Contributors"
47
47
 
48
48
  # ── Core types ────────────────────────────────────────────────────────────────
@@ -88,10 +88,6 @@ from .providers import (
88
88
  MistralProvider,
89
89
  CohereProvider,
90
90
  DeepSeekProvider,
91
- HorusCyberNano,
92
- HorusCyberNanoAPIError,
93
- HorusCyberNanoProvider,
94
- HPreviewProvider,
95
91
  LlamaCppProvider,
96
92
  TransformersProvider,
97
93
  UniversalLocalProvider,
@@ -263,16 +259,6 @@ try:
263
259
  except ImportError:
264
260
  _SLACK_AVAILABLE = False
265
261
 
266
- try:
267
- from .integrations.whatsapp import (
268
- TwilioWhatsAppBot,
269
- create_twilio_whatsapp_bot,
270
- )
271
-
272
- _WHATSAPP_AVAILABLE = True
273
- except ImportError:
274
- _WHATSAPP_AVAILABLE = False
275
-
276
262
  try:
277
263
  from .integrations.openclaw import (
278
264
  OpenClawManager,
@@ -287,14 +273,6 @@ except ImportError:
287
273
  # Logging helper
288
274
  from .utils.logger import get_logger, setup_logging
289
275
  from .utils.dependencies import ensure_feature_dependencies
290
- from .api import (
291
- APIKeyStore,
292
- H_PREVIEW_HF_REPO,
293
- H_PREVIEW_MODEL,
294
- create_api_app,
295
- generate_admin_token,
296
- run_api_server,
297
- )
298
276
 
299
277
  # ── Skill → tools mapping ─────────────────────────────────────────────────────
300
278
 
@@ -433,6 +411,8 @@ class NeuralNode:
433
411
  system_prompt: str = None,
434
412
  history: list = None,
435
413
  stream: bool = False,
414
+ thinking=None,
415
+ **kwargs,
436
416
  ):
437
417
  """Send a single message and get a response.
438
418
 
@@ -465,7 +445,14 @@ class NeuralNode:
465
445
  messages.append(Message.assistant(content))
466
446
 
467
447
  messages.append(Message.user(message))
468
- response = self._llm.chat(messages, stream=stream)
448
+ provider_kwargs = {
449
+ "temperature": self.temperature,
450
+ "max_tokens": self.max_tokens,
451
+ **kwargs,
452
+ }
453
+ if thinking is not None:
454
+ provider_kwargs["thinking"] = thinking
455
+ response = self._llm.chat(messages, stream=stream, **provider_kwargs)
469
456
 
470
457
  if stream:
471
458
  return (chunk.content for chunk in ensure_streaming_chunks(response))
@@ -737,16 +724,6 @@ __all__ = [
737
724
  "MistralProvider",
738
725
  "CohereProvider",
739
726
  "DeepSeekProvider",
740
- "HorusCyberNano",
741
- "HorusCyberNanoAPIError",
742
- "HorusCyberNanoProvider",
743
- "HPreviewProvider",
744
- "APIKeyStore",
745
- "H_PREVIEW_HF_REPO",
746
- "H_PREVIEW_MODEL",
747
- "create_api_app",
748
- "generate_admin_token",
749
- "run_api_server",
750
727
  "LlamaCppProvider",
751
728
  "TransformersProvider",
752
729
  "UniversalLocalProvider",
@@ -872,11 +849,6 @@ if _TURBOQUANT_AVAILABLE:
872
849
  __all__ += ["TurboQuant", "TurboQuantEngine", "TurboQuantConfig"]
873
850
  if _THINKING_AVAILABLE:
874
851
  __all__ += ["ThinkingMode", "ThinkingResponse", "enable_thinking"]
875
- if _WHATSAPP_AVAILABLE:
876
- __all__ += [
877
- "TwilioWhatsAppBot",
878
- "create_twilio_whatsapp_bot",
879
- ]
880
852
  if _OPENCLAW_AVAILABLE:
881
853
  __all__ += [
882
854
  "OpenClawManager",
@@ -148,6 +148,13 @@ def ensure_llm_response(
148
148
  )
149
149
  )
150
150
 
151
+ metadata = dict(response.get("metadata", {}) or {})
152
+ # Preserve provider-specific reasoning traces (for example Ollama's
153
+ # native ``message.thinking``) without changing the stable response
154
+ # shape used by existing callers.
155
+ if response.get("thinking") is not None and "thinking" not in metadata:
156
+ metadata["thinking"] = response.get("thinking")
157
+
151
158
  return LLMResponse(
152
159
  content=response.get("content", ""),
153
160
  model=response.get("model", default_model),
@@ -155,7 +162,7 @@ def ensure_llm_response(
155
162
  tool_calls=tool_calls,
156
163
  usage=response.get("usage", {}) or {},
157
164
  finish_reason=response.get("finish_reason"),
158
- metadata=response.get("metadata", {}) or {},
165
+ metadata=metadata,
159
166
  )
160
167
 
161
168
  raise TypeError(f"Unsupported response type: {type(response)!r}")
@@ -9,7 +9,6 @@ from .telegram import (
9
9
  )
10
10
  from .discord import DiscordBot
11
11
  from .slack import SlackBot
12
- from .whatsapp import TwilioWhatsAppBot, create_twilio_whatsapp_bot
13
12
  from .openclaw import OpenClawManager, OpenClawServer, OpenClawClient
14
13
 
15
14
  __all__ = [
@@ -20,8 +19,6 @@ __all__ = [
20
19
  "create_telegram_bot",
21
20
  "DiscordBot",
22
21
  "SlackBot",
23
- "TwilioWhatsAppBot",
24
- "create_twilio_whatsapp_bot",
25
22
  "OpenClawManager",
26
23
  "OpenClawServer",
27
24
  "OpenClawClient",