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.
- {neuralnode-2.2.8 → neuralnode-2.2.9}/.env.example +0 -13
- {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/workflows/tests.yml +1 -1
- {neuralnode-2.2.8 → neuralnode-2.2.9}/.gitignore +4 -1
- neuralnode-2.2.9/CHANGELOG.md +89 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/PKG-INFO +36 -59
- {neuralnode-2.2.8 → neuralnode-2.2.9}/README.md +31 -49
- {neuralnode-2.2.8 → neuralnode-2.2.9}/pyproject.toml +5 -15
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/__init__.py +11 -39
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/core/__init__.py +8 -1
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/__init__.py +0 -3
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/openclaw.py +46 -13
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/__init__.py +0 -11
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/__init__.py +0 -10
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/embeddings.py +19 -13
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/local_providers.py +98 -27
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_providers_mocked.py +82 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_release_readiness.py +2 -5
- neuralnode-2.2.8/.ci-dist/neuralnode-2.2.8-py3-none-any.whl +0 -0
- neuralnode-2.2.8/.ci-dist/neuralnode-2.2.8.tar.gz +0 -0
- neuralnode-2.2.8/Dockerfile +0 -44
- neuralnode-2.2.8/docker-compose.yml +0 -74
- neuralnode-2.2.8/docs/ecosystem_plan.md +0 -482
- neuralnode-2.2.8/docs/model_api.md +0 -76
- neuralnode-2.2.8/examples/horus_cyber_nano_agent_mode.py +0 -67
- neuralnode-2.2.8/examples/horus_cyber_nano_early_access.py +0 -22
- neuralnode-2.2.8/examples/whatsapp_bot_demo.py +0 -2
- neuralnode-2.2.8/horus_chat_voice.py +0 -61
- neuralnode-2.2.8/neuralnode_horus_replica_telegram.ipynb +0 -405
- neuralnode-2.2.8/publish.bat +0 -71
- neuralnode-2.2.8/publish.sh +0 -68
- neuralnode-2.2.8/requirements_shade.txt +0 -40
- neuralnode-2.2.8/scripts/setup.py +0 -127
- neuralnode-2.2.8/src/debug_import.py +0 -37
- neuralnode-2.2.8/src/neuralnode/api.py +0 -341
- neuralnode-2.2.8/src/neuralnode/integrations/whatsapp.py +0 -99
- neuralnode-2.2.8/src/neuralnode/providers/chat/h_preview.py +0 -113
- neuralnode-2.2.8/src/neuralnode/providers/chat/horus_cyber_nano.py +0 -375
- neuralnode-2.2.8/tests/test_horus_cyber_nano_api.py +0 -222
- {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/.github/workflows/publish.yml +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/CONTRIBUTING.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/LICENSE +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/NOTICE +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/THIRD_PARTY_NOTICES.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/TOKENAI_CLA.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/TRADEMARKS.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/assets/neuralnode-logo-transparent.png +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/documentation.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/replica_voice_ids.csv +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/replica_voice_ids.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/docs/telegram_guide.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/agent_with_tools.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/basic_chat.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/01_basic_usage.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/02_horus_lens.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/03_one_liner.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/04_custom_cache.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/05_4bit_quantization.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/06_8bit_quantization.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/07_multi_gpu.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/08_flash_attention.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/09_data_types.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/10_generation_params.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/11_streaming.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/12_chat_templates.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/13_offline_mode.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/14_force_download.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/15_model_info.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/16_cpu_offloading.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/17_cpu_only.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/18_production_setup.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/19_gguf_4bit.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/20_gguf_5bit.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/21_gguf_6bit.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/22_gguf_8bit.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/23_gguf_16bit.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/24_list_models.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/25_interactive_chat.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/26_horus_hiero.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_codes_camples/README.md +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_download_guide.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_examples.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_tq_ready_gguf.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/horus_transformers_features.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/local_models.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/neuralnode_v21_complete_demo.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/openclaw_demo.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/shade_model_with_tools.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/telegram_bot_demo.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/thinking_mode_example.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/tts_demo.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/turboquant_example.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/examples/v3_features.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/media/neuralnode.png +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/agents.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/base.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/agents/thinking.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/chains/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/config/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/core/openai_blocker.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/diagnostics/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/discord.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/slack.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/integrations/telegram.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/advanced.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/conversation.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/file.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/sliding.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/memory/summary.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/prompts/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/base.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/ai21.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/anthropic.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/bedrock.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/cohere.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/deepseek.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/fireworks.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/google.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/groq.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/mistral.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/openai.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/perplexity.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/together.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/chat/vertex.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/hfhub.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/horus.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/image_generation.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/local/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/text_generation.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/providers/universal_local.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/rag/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/reasoning/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/replica.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/speech/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/thinking.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/advanced.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/multisearch.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/system/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/system/operations.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tools/web/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/tts/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/turboquant.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/dependencies.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/logger.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/utils/metrics.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/vectorstores/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/vision/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/neuralnode/voice.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/src/nn/__init__.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_agents_basic.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_hfhub.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_image_generation.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_memory.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_openclaw.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_provider_capabilities.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_rag.py +0 -0
- {neuralnode-2.2.8 → neuralnode-2.2.9}/tests/test_refactoring.py +0 -0
- {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.
|
|
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.
|
|
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://
|
|
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 <
|
|
11
|
-
Maintainer-email: Assem Sabry <
|
|
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
|
|
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.
|
|
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.
|
|
793
|
-
- **NeuralNode**: [https://
|
|
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
|
|
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.
|
|
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.
|
|
436
|
-
- **NeuralNode**: [https://
|
|
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.
|
|
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 = "
|
|
14
|
+
{name = "Assem Sabry", email = "assemsabry777@gmail.com"}
|
|
15
15
|
]
|
|
16
16
|
maintainers = [
|
|
17
|
-
{name = "Assem Sabry", email = "
|
|
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://
|
|
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.
|
|
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
|
-
|
|
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=
|
|
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",
|