Where Is the Needle 2 Inference Engine Cached and How Is Its Path Resolved?
The Needle 2 inference engine is stored in a versioned cache directory under ~/.cache/cactus-needle/<engine-version>/, with its location determined by a four-step resolution chain defined in needle/__init__.py.
When working with the cactus-compute/needle repository, understanding where the Needle 2 inference engine is cached and how its path is resolved is essential for offline deployments and custom installations. The library uses a deterministic fallback hierarchy to locate the native binary, ensuring reproducible behavior across environments while allowing flexible overrides for advanced use cases.
Cache Location and Resolution Hierarchy
The Four-Step Resolution Order
Inside needle/__init__.py, the private helper _library_path() implements the following lookup sequence:
-
Environment variable override – If
NEEDLE_LIB_PATHis set, the function returns that path immediately without further checks. -
Local package copy – The code checks for a library file matching
fetch._lib_name()in the same directory asneedle/agent/fetch.py. If present, this local copy takes precedence over the cache. -
Cache directory lookup – The function constructs the path:
os.path.join(os.path.expanduser("~"), ".cache", "cactus-needle", fetch.ENGINE_VERSION)If the engine binary exists here, that path is returned. As defined in
needle/agent/fetch.py, the currentENGINE_VERSIONis"2.0.3". -
On-demand download – If the binary is missing, the code creates the cache directory (if necessary) and invokes
fetch.fetch_library()to download the engine from Hugging Face into the cache location.
Key Implementation Files
Path Resolution in needle/init.py
The _library_path() function spans lines 19–31 in needle/__init__.py. This method orchestrates the resolution logic and handles the fallback from environment variables through local copies to the final cache-based storage.
Version Definition in needle/agent/fetch.py
The cache subdirectory name derives from the ENGINE_VERSION constant defined at line 8 of needle/agent/fetch.py:
ENGINE_VERSION = "2.0.3"
This ensures that different engine versions reside in isolated cache directories, preventing binary incompatibility during upgrades.
CLI Integration in needle/cli.py
For air-gapped environments, the needle fetch command (implemented in needle/cli.py, lines 177–245) triggers the same caching logic manually, allowing administrators to pre-download the engine before deployment.
Practical Usage Examples
Default Automatic Caching
When you instantiate the Needle class without configuration, the engine downloads automatically on first use:
from needle import Needle
agent = Needle(tools=my_tools, system="You are a helpful assistant")
Using a Custom Engine Path
For offline devices or custom builds, override the resolution chain by setting the environment variable:
import os
from needle import Needle
os.environ["NEEDLE_LIB_PATH"] = "/opt/needle/needle_engine.so"
agent = Needle(tools=my_tools)
Pre-fetching for Air-Gapped Systems
To populate the cache without instantiating the class, use the CLI:
needle fetch
This executes the download logic directly, placing the binary in ~/.cache/cactus-needle/2.0.3/ for subsequent Python sessions.
Summary
- The Needle 2 inference engine resides in
~/.cache/cactus-needle/<version>/, where version is currently2.0.3. - Resolution follows a strict hierarchy:
NEEDLE_LIB_PATH→ local package copy → existing cache → download viafetch.fetch_library(). - The
_library_path()helper inneedle/__init__.py(lines 19–31) implements this four-step lookup. - Version isolation prevents conflicts between different engine releases.
- Use
needle fetchto pre-populate the cache on disconnected systems.
Frequently Asked Questions
How do I change where Needle stores the inference engine?
Set the NEEDLE_LIB_PATH environment variable to an absolute path containing the engine binary. When this variable is present, the _library_path() function bypasses all other resolution steps and uses your specified location.
Can Needle run completely offline?
Yes. Pre-populate the cache by running needle fetch while connected, then transfer the ~/.cache/cactus-needle/ directory to your air-gapped environment. Alternatively, set NEEDLE_LIB_PATH to point to a manually copied binary.
What happens when the engine version updates?
The ENGINE_VERSION constant in needle/agent/fetch.py increments, causing _library_path() to look in a new subdirectory (e.g., ~/.cache/cactus-needle/2.0.4/). The library treats each version as independent, leaving existing caches intact while downloading the new binary.
Where does the download originate if the cache is empty?
When resolution reaches step four, fetch.fetch_library() retrieves the engine from Hugging Face, specifically targeting the release assets matching the ENGINE_VERSION string defined in the source.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →