syft-nsai
Bridge Data and AI. Privately.
An OpenAI-compatible interface for using SyftBox datasets with AI models in secure enclaves.
🚀 What is syft-nsai?
syft-nsai transforms how you work with federated datasets by providing a familiar OpenAI-style chat completions API that operates within secure enclaves. No more complex setup or unfamiliar APIs - just select your datasets and chat with your data.
import syft_datasets as syd
import syft_nsai as nsai
# Discover datasets with beautiful interactive UI
syd.datasets
# Use them with familiar OpenAI-style API
selected_datasets = [syd.datasets[i] for i in [0, 1, 5]]
response = nsai.client.chat.completions.create(
model=selected_datasets, # Your datasets become the "model"
messages=[{"role": "user", "content": "What trends do you see in this data?"}]
)
# Access results
print(response.choices[0].message.content)
✨ Key Features
- 🔒 Privacy-First: All processing happens in secure enclaves
- 🤝 OpenAI Compatible: Drop-in replacement for familiar chat completions API
- 📊 Real Data Integration: Datasets are loaded and summarized before AI analysis
- ⚡ Lazy Loading: Results are fetched asynchronously for better UX
- 🔄 Seamless Integration: Works perfectly with
syft-datasetsfor dataset discovery
🏗️ Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ syft-datasets │ │ syft-nsai │ │ Secure Enclave │
│ │ │ │ │ │
│ Dataset Discovery│───▶│OpenAI-style API │───▶│ AI Processing │
│ Interactive UI │ │Chat Completions │ │ with Real Data │
│ Search & Select │ │Async Results │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
📦 Installation
pip install syft-nsai
For development:
pip install syft-nsai[dev]
🔑 Configuration
Tinfoil API Key
syft-nsai uses syft-wallet for secure API key management. When you first use NSAI, it will automatically:
- Check syft-wallet for your Tinfoil API key
- Check environment variables as a fallback
- Prompt you to enter the key if not found anywhere
- Save it securely to syft-wallet for future use
First-time Setup
import syft_nsai as nsai
# On first use, you'll be prompted for your API key
response = nsai.client.chat.completions.create(
model=datasets,
messages=[{"role": "user", "content": "Hello"}]
)
# 🔑 Tinfoil API Key Required
# NSAI needs a Tinfoil API key to run AI models in secure enclaves.
# You can get a free API key at: https://tinfoil.sh/
# Please enter your Tinfoil API key: tk_xxxxx...
# ✓ API key saved securely to syft-wallet
Manual Key Management
import syft_nsai as nsai
# Set or update your API key
nsai.set_tinfoil_api_key("tk_your_new_key_here")
# or prompt for input:
nsai.set_tinfoil_api_key()
# Check current key status
nsai.show_tinfoil_status()
# ✓ Tinfoil API key found: tk_SxHBk...UOFd
# Get the key programmatically
api_key = nsai.get_tinfoil_api_key()
Environment Variable Fallback
You can still use environment variables:
export TINFOIL_API_KEY="tk_your_key_here"
NSAI will detect this and offer to save it to syft-wallet for easier future use.
Security Benefits:
- ✅ Keys stored in 1Password (if available) or secure system keyring
- ✅ No hardcoded keys in your code
- ✅ One-time setup per machine
- ✅ Automatic detection across all methods
🚀 Quick Start
1. Discover Datasets
First, use syft-datasets to explore available datasets:
import syft_datasets as syd
# Show interactive dataset browser
syd.datasets
2. Select and Analyze
Use the selected datasets with the OpenAI-compatible API:
import syft_nsai as nsai
# Select datasets (from the interactive UI or programmatically)
my_datasets = [syd.datasets[0], syd.datasets[3]]
# Create chat completion
response = nsai.client.chat.completions.create(
model=my_datasets,
messages=[
{"role": "system", "content": "You are a data analyst."},
{"role": "user", "content": "Summarize the key insights from this data."}
]
)
# Results are loaded lazily when accessed
insights = response.choices[0].message.content
print(insights)
3. Advanced Usage
# Multiple datasets for cross-analysis
crop_data = syd.datasets.search("crop")[0]
weather_data = syd.datasets.search("weather")[0]
response = nsai.client.chat.completions.create(
model=[crop_data, weather_data],
messages=[{
"role": "user",
"content": "Analyze the correlation between weather patterns and crop yields."
}]
)
🔧 How It Works
- Dataset Integration: Selected datasets are loaded and analyzed within the enclave
- Context Enhancement: Your prompts are enhanced with actual dataset summaries and sample data
- Secure Processing: AI analysis happens in a privacy-preserving enclave using Tinfoil API
- Familiar Interface: Results are returned through OpenAI-compatible response objects
🔗 Integration with SyftBox Ecosystem
syft-nsai is part of the broader SyftBox ecosystem:
- syft-datasets: Dataset discovery and management
- syft-core: Core SyftBox functionality
- syftbox-enclave: Secure enclave execution
- syft-rds: Remote data science capabilities
📚 API Reference
Client
import syft_nsai as nsai
# Global client instance
client = nsai.client
Chat Completions
response = nsai.client.chat.completions.create(
model=datasets_list, # List of Dataset objects
messages=messages_list, # OpenAI-style messages
**kwargs # Additional parameters
)
Response Objects
# ChatCompletion
response.choices # List of Choice objects
# Choice
choice = response.choices[0]
choice.message # Message object
# Message
message = choice.message
message.content # Actual AI response (lazy loaded)
API Key Management
# Set or update Tinfoil API key
nsai.set_tinfoil_api_key(api_key=None) # Prompts if None
# Get current API key
api_key = nsai.get_tinfoil_api_key() # Raises ValueError if not found
# Check key status
nsai.show_tinfoil_status() # Shows masked key or missing status
🧪 Development
Setup
git clone https://github.com/OpenMined/syft-nsai
cd syft-nsai
uv sync
Testing
uv run pytest
Linting
uv run ruff check .
uv run ruff format .
🤝 Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
📄 License
Licensed under the Apache License, Version 2.0. See LICENSE for details.
🙏 Acknowledgments
Built with ❤️ by the OpenMined community. Special thanks to:
- The Tinfoil team for secure AI infrastructure
- SyftBox contributors for the federated data ecosystem
- The broader privacy-preserving ML community
Transform your data science workflow. Privately and securely.
Metadata
Release files for syft-nsai 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| syft_nsai-0.1.1.tar.gz | 22.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| syft_nsai-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.8 kB
Release files / syft_nsai-0.1.1.tar.gz
| Download URL | syft_nsai-0.1.1.tar.gz |
|---|---|
| Size | 22.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
61e81de00df2f82c542605645c5f1292692487738072bfa7f1740c07c1ad930b
|
|
BLAKE2b-256 checksum How to use checksums |
ccce6147b385b94e4814a8727494408dc1ead64ee1bfb04e7312555ee4122369
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Release files / syft_nsai-0.1.1-py3-none-any.whl
| Download URL | syft_nsai-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bd870721199b42b89447c7d6b611b15ba65fad20685bd96db538167e32c23dae
|
|
BLAKE2b-256 checksum How to use checksums |
0a82fad31176704d4b4cad1d618760838ccabfd23dc77257c80c0afea27ea3c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|