NeuronLens Python Package - Interpretability analysis functions
Project description
NeuronLens Python Package
A Python package for accessing NeuronLens interpretability analysis functions.
Server Deployment (New Machine)
Setup: Clone sae_app_v3, set NGROK_AUTH_TOKEN and API_KEY in environment (or cloud_config.json), run ./start_frontend_backend.sh && ./api_key_util/start_ngrok.sh. Override API URL: NEURONLENS_API_URL env var or pip/config.json (1-2 places control everything). See Developer Guide.
Installation
pip install neuronlens
For development (editable install):
cd sae_app_v3/pip
pip install -e .
Publishing to PyPI
To publish a new version to PyPI:
-
Update version in
setup.pyand__init__.py -
Build package:
cd sae_app_v3/pip python -m build
-
Publish to PyPI (using token from
.envfile):# Load PyPI credentials from .env (not committed to git) export $(cat .env | xargs) python -m twine upload dist/*
Note: PyPI API token is stored in sae_app_v3/pip/.env (excluded from git via .gitignore).
Quick Start
With API Key (Required)
Note: API key is required for all functions. You must provide it either via parameter or environment variable.
import neuronlens
# Initialize with API key
NEURONLENS_API_KEY = "nlive_your_api_key_here"
engine = neuronlens.Engine(api_key=NEURONLENS_API_KEY)
# Optionally specify frontend API URL (defaults to http://localhost:8001)
# engine = neuronlens.Engine(api_key=NEURONLENS_API_KEY, api_url="https://your-ngrok-url.ngrok-free.dev")
# Use functions directly
result = engine.analyze_agent("Get Tesla stock price")
print(f"Alignment: {result['alignment_status']}")
Environment Variables
You can also set the API key via environment variables:
export NEURONLENS_API_KEY="nlive_your_api_key_here"
export NEURONLENS_API_URL="https://your-ngrok-url.ngrok-free.dev" # Optional
Then initialize:
import neuronlens
engine = neuronlens.Engine() # Automatically picks up from environment
Architecture
The package works in two modes:
- Direct mode: When
sae_app_v3is available, imports and calls functions directly - HTTP mode: When
sae_app_v3is not available (pip install), makes HTTP requests to frontend server (port 8001)
Server Requirements:
- Backend server must be running on
http://localhost:8000(GPU operations) - Frontend server must be running on
http://localhost:8001(High-level API) - Frontend server can be exposed via ngrok for remote access
Function Reference
High-Level Analysis Functions
engine.analyze_agent(query, response=None, model_path=None, sae_path=None, layer=19, api_url=None, **kwargs)
Analyze agent tool intent and alignment. Returns alignment_status, tool_called, intent_scores, top_features.
engine.analyze_sentiment(text, top_n=10, model_path=None, sae_path=None, layer=10, api_url=None, **kwargs)
Analyze sentiment with SAE feature attribution. Returns sentiment (predicted_label, confidence, probabilities) and top_features.
Note: top_n only applies in HTTP mode; direct mode uses hardcoded top_n=10.
engine.analyze_trading(text, ticker=None, model_path=None, sae_path=None, layer=19, api_url=None, **kwargs)
Extract trading signals from news text. Returns trading signals and direction.
engine.analyze_reasoning(prompt, model_path=None, sae_path=None, layer=28, expected_buckets=None, api_url=None, **kwargs)
Analyze CoT reasoning faithfulness. Returns reasoning analysis with bucket alignment.
engine.analyze_hallucination(prompt, max_tokens=256, temperature=0.7, api_url=None, **kwargs)
Token-level hallucination detection. Returns token_details with risk scores per token.
engine.search_features(query, k=10, layer=16, api_url=None, **kwargs)
Search features using semantic similarity. Returns list of features with feature_id, score, and label.
engine.steer_features(prompt, features, model="meta-llama/Llama-2-7b-hf", api_url=None, **kwargs)
Apply feature steering. Features: list of dicts with "id" and "magnitude" (-1.0 to +1.0). Returns original_text and steered_text.
Common Backend Wrapper Functions
engine.extract_top_features(text, model_path, sae_path, layer, top_n=10, use_hf_model=False, use_hf_sae=False, sae_config_path=None, api_url=None, **kwargs)
Extract top SAE features from text. Returns dictionary with features array and top_features list.
engine.unload_model(model_path, device=None, **kwargs)
Unload specific model from cache. Returns success status.
engine.unload_all_models(**kwargs)
Unload all models from cache. Returns success status.
engine.model_cache_status(**kwargs)
Get model cache status. Returns dictionary with loaded_models list and cache information.
Complete Examples
Agent Lens Analysis
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
result = engine.analyze_agent("What's the latest news about Apple?")
print(f"Query: {result['query']}")
print(f"Alignment Status: {result['alignment_status']}") # GREEN, AMBER, or RED
print(f"Expected Tools: {result['expected_tools']}")
print(f"Tool Called: {result['tool_called']}")
print(f"Intent Scores: {result['intent_scores']}")
# Top activated features
for feature in result['top_features'][:5]:
print(f"Feature #{feature['feature_id']}: {feature['activation']:.4f}")
Sentiment Analysis
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
result = engine.analyze_sentiment(
text="Strong quarterly earnings exceeded expectations",
top_n=10
)
sentiment = result['sentiment']
print(f"Predicted Label: {sentiment['predicted_label']}")
print(f"Confidence: {sentiment['confidence']:.3f}")
# Top contributing features
for feature in result['top_features']:
print(f"Feature #{feature['feature_id']}: {feature['activation']:.4f}")
Trading Lens
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
# Extract signals
signals = engine.analyze_trading(
text="Apple earnings beat expectations by 15%",
ticker="AAPL"
)
print(f"Signals: {signals}")
Reasoning Lens
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
result = engine.analyze_reasoning(
prompt="What is 2+2? Show your reasoning step by step.",
max_new_tokens=2048
)
print(f"Reasoning Analysis: {result}")
Hallucination Detection
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
result = engine.analyze_hallucination(
prompt="Write a summary about Apple",
max_tokens=256,
temperature=0.7
)
print(f"Token Details: {len(result.get('token_details', []))} tokens analyzed")
Search & Steer
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
# Search for features
features = engine.search_features(
query="market volatility and uncertainty",
k=10,
layer=16
)
# Steer using found features
steered = engine.steer_features(
prompt="What is the market outlook for tech stocks?",
features=[
{"id": features[0]['feature_id'], "magnitude": 0.7}, # Steer towards
{"id": features[1]['feature_id'], "magnitude": -0.5} # Steer away
],
model="meta-llama/Llama-2-7b-hf"
)
print(f"Original: {steered['original_text']}")
print(f"Steered: {steered['steered_text']}")
Common Functions
import neuronlens
engine = neuronlens.Engine(api_key="nlive_your_key")
# Extract features directly
features = engine.extract_top_features(
text="Strong earnings report",
model_path="ProsusAI/finbert",
sae_path="/path/to/sae",
layer=10,
top_n=10
)
# Check cache status
status = engine.model_cache_status()
print(f"Models loaded: {status.get('loaded_models', [])}")
# Unload all models
engine.unload_all_models()
How It Works
Direct Mode (when sae_app_v3 is available)
- Imports functions directly from
sae_app_v3.api_functions - Uses
APIClient.patch_requests()to inject API key into HTTP requests - Calls backend functions directly for common operations
- No HTTP overhead for function calls
HTTP Mode (when sae_app_v3 not available, pip install)
- Makes HTTP requests to frontend server on port 8001
- All requests include
X-API-Keyheader - Works standalone without sae_app_v3 codebase
The Engine class automatically:
- Detects if
sae_app_v3is available - Uses direct mode if available, HTTP mode otherwise
- Injects
X-API-Keyheader in all HTTP requests - Handles async functions automatically
Error Handling
import neuronlens
try:
engine = neuronlens.Engine(api_key="invalid_key")
result = engine.analyze_agent("Get Tesla price")
except ValueError as e:
if "API key is required" in str(e):
print("Error: API key is required")
else:
print(f"Configuration error: {e}")
except requests.exceptions.HTTPError as e:
if e.response.status_code == 401:
print("Authentication failed: Invalid API key")
else:
print(f"API error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
Requirements
- Python 3.8+
- requests>=2.25.0
- numpy>=1.20.0
For full functionality, you need:
- Backend server running on port 8000
- Frontend server running on port 8001
- See
FUNCTION_LIST.mdin sae_app_v3 for server setup instructions
Developer Guide
Updating API URL When Ngrok Changes
When the backend API URL changes (e.g., new ngrok URL), update it using one of these methods (priority order):
-
Config File (
sae_app_v3/pip/config.json):{"api_url": "https://new-ngrok-url.ngrok-free.dev", "timeout": 30}
-
Environment Variable:
export NEURONLENS_API_URL="https://new-ngrok-url.ngrok-free.dev"
-
.ngrok_urlFile (Auto-detected):echo "https://new-ngrok-url.ngrok-free.dev" > sae_app_v3/.ngrok_url
-
Ngrok API (Auto-detected from
http://127.0.0.1:4040/api/tunnels) -
Engine Constructor:
engine = neuronlens.Engine(api_key="key", api_url="https://new-url.ngrok-free.dev")
API Key Configuration
Where to put the API key:
- Environment Variable:
export NEURONLENS_API_KEY="nlive_your_key"orexport API_KEY="nlive_your_key" .envFile (sae_app_v3/.env):API_KEY=nlive_your_key(load withpython-dotenv)- Engine Constructor:
engine = neuronlens.Engine(api_key="nlive_your_key")
Note: API key is required for all functions. Engine raises ValueError if missing.
HTTP Mode (Standalone)
When sae_app_v3 is not available (pip install), package works completely via HTTP:
- All calls make HTTP requests to frontend server (port 8001) via ngrok
- No local code dependencies - works from any machine
- API key automatically injected in
X-API-Keyheader
engine = neuronlens.Engine(api_key="key", api_url="https://ngrok-url.ngrok-free.dev")
result = engine.analyze_sentiment("text") # POST to /frontend/analyze_sentiment
Direct Mode (Local Development)
When sae_app_v3 is available, package uses direct function calls:
- High-level: Imports from
sae_app_v3.api_functions, calls directly, injects API key via patchedrequests.post - Common: Imports from
sae_app_v3.backend.commonandsae_app_v3.services.model_loader, calls directly - API key still required (validated in constructor)
engine = neuronlens.Engine(api_key="key")
status = engine.model_cache_status() # Direct call, no HTTP
result = engine.analyze_sentiment("text") # Direct call, API key injected for internal backend calls
Configuration Files
sae_app_v3/pip/config.json- Default API URL (edit this file)sae_app_v3/.ngrok_url- Auto-detected ngrok URLsae_app_v3/.env- API key and URL (requires python-dotenv)sae_app_v3/pip/.env- PyPI API token for publishing (not committed to git)sae_app_v3/pip/config.py- URL detection logic (modify if needed)
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neuronlens-0.2.3.tar.gz.
File metadata
- Download URL: neuronlens-0.2.3.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac2600491447c923893fa09f7a6ba00e330d94e5c056cc89d2106fcaa6f193e7
|
|
| MD5 |
4c7518cad1d1bead88610814a8a1049b
|
|
| BLAKE2b-256 |
0bc832022b61e0b893e7a678eab6d1add4ffca5ba0b2aa030bf05e8c24e657be
|
File details
Details for the file neuronlens-0.2.3-py3-none-any.whl.
File metadata
- Download URL: neuronlens-0.2.3-py3-none-any.whl
- Upload date:
- Size: 22.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa34a4ab6f6f2bb1cccce717e8bf399ae5f6f41fefdf113da00ae95bf0b57f5f
|
|
| MD5 |
8db5f357d706c038dc5840d43350ad57
|
|
| BLAKE2b-256 |
36c240f239686125b1e3326ccbd551ee6bcd7ab93a9007942ba46e6d4f0e76c1
|