Skip to main content

UltraGuard

Enterprise-Grade LLM Security Framework

A comprehensive security toolkit providing 40+ security scanners and programmable guardrails for LLM-powered applications. Built by 100XPrompt.

MIT license PyPI Python 3.9+ Code style: black

Features

  • 40+ Security Scanners - Comprehensive input/output scanning for prompt injection, secrets, PII, toxicity, and more
  • Programmable Guardrails - Define conversation flows and safety boundaries with Colang DSL
  • Flexible Rails System - Input, output, dialog, retrieval, and execution rails
  • 23 Pre-built Libraries - Ready-to-use security libraries for various use cases
  • Streaming Support - Real-time streaming with guardrails enforcement
  • 8 Embedding Providers - OpenAI, Azure, Cohere, Google, FastEmbed, SentenceTransformers, and more
  • LangChain Integration - Seamless integration with LangChain runnables
  • Built-in Caching - LFU cache for improved performance
  • Distributed Tracing - OpenTelemetry-compatible tracing for observability
  • Async-First Design - Native async/await support throughout
  • REST API Server - Production-ready FastAPI server
  • CLI Tools - Command-line interface for common operations

Installation

pip install ultraguard

For additional features:

pip install ultraguard[onnx]       # ONNX runtime for ML models
pip install ultraguard[embeddings] # Embedding providers
pip install ultraguard[eval]       # Evaluation UI
pip install ultraguard[all]        # All optional dependencies

Quick Start

Basic Scanning

from ultraguard.scanner.scanners.input import Toxicity, TokenLimit, Secrets
from ultraguard.scanner.scanners.output import JSON, Bias

# Input scanning
secrets = Secrets()
result = secrets.scan("My API key is sk-abc123...")
print(f"Valid: {result.is_valid}, Risk: {result.risk_score}")

# Output scanning
json_scanner = JSON()
result = json_scanner.scan("prompt", '{"key": "value"}')
print(f"Valid: {result.is_valid}")

LLMRails - Full Pipeline

from ultraguard import LLMRails, action
from ultraguard.config import RailsConfig

# Configure guardrails
config = RailsConfig(
    input_scanners=["toxicity", "secrets", "prompt_injection"],
    output_scanners=["bias", "json", "sensitive"],
)

rails = LLMRails(config=config)

# Use with async
async def main():
    result = await rails.generate_async([
        {"role": "user", "content": "Hello, how are you?"}
    ])
    print(result.text)

import asyncio
asyncio.run(main())

Custom Actions

from ultraguard import LLMRails, action

@action()
async def check_greeting(text: str) -> dict:
    greetings = ['hello', 'hi', 'hey']
    is_greeting = any(g in text.lower() for g in greetings)
    return {'is_valid': True, 'is_greeting': is_greeting}

rails = LLMRails(config={'input_scanners': ['greeting']})
rails.register_action(check_greeting)

Colang DSL - Conversation Flows

from ultraguard import LLMRails

colang_config = """
define user express greeting
  "Hello!"
  "Hi there!"

define flow
  user express greeting
  bot express greeting

define bot express greeting
  "Hello! How can I assist you today?"
"""

rails = LLMRails.from_colang(colang_config)
result = rails.generate([{'role': 'user', 'content': 'Hello!'}])

Scanners

Input Scanners (18 scanners)

Scanner Description
Anonymize Detect and mask PII/sensitive data
BanCode Prevent code snippets in input
BanCompetitors Block competitor names/mentions
BanSubstrings Block specific substrings
BanTopics Restrict specific topics
Code Detect and analyze code content
EmotionDetection Detect emotional content
Gibberish Detect nonsensical input
InvisibleText Detect hidden/invisible characters
Language Identify input language
PromptInjection Detect prompt injection attacks
ReadingTime Estimate reading time
Regex Pattern-based detection
Secrets Detect API keys, tokens, passwords (160+ patterns)
Sentiment Analyze sentiment of input
TokenLimit Enforce token count limits
Toxicity Detect toxic/harmful content

Output Scanners (22 scanners)

Scanner Description
BanCode Prevent code in outputs
BanCompetitors Block competitor mentions
BanSubstrings Filter specific substrings
BanTopics Restrict topics in output
Bias Detect biased content
Code Analyze code in output
Deanonymize Restore masked PII
EmotionDetection Detect emotional output
FactualConsistency Check factual accuracy
Gibberish Detect nonsensical output
JSON Validate JSON structure
Language Identify output language
LanguageSame Ensure input/output language match
MaliciousURLs Detect malicious URLs
NoRefusal Check for refusal patterns
Regex Pattern-based output filtering
Relevance Check output relevance
Sensitive Detect sensitive information
Sentiment Analyze output sentiment
Toxicity Detect toxic output
URLReachability Validate URL accessibility

Pre-built Libraries (23 libraries)

UltraGuard includes production-ready security libraries:

Library Purpose
content_safety Content safety classification
injection_detection Prompt injection detection
jailbreak_detection Jailbreak attempt detection
sensitive_data PII detection and masking
factchecking Fact verification
hallucination Hallucination detection
topic_safety Topic-based safety
self_check Self-consistency checks
llama_guard Meta Llama Guard integration
guardrails_ai Guardrails AI integration
gliner GLiNER NER models
pangea Pangea security services
privateai PrivateAI integration
prompt_security Prompt security scanning
activefence ActiveFence integration
ai_defense AI Defense integration
autoalign AutoAlign integration
cleanlab Cleanlab integration
fiddler Fiddler AI integration
gcp_moderate_text Google Cloud moderation
patronusai Patronus AI integration
trend_micro Trend Micro integration

Configuration

YAML Configuration

# config.yml
models:
  - type: main
    engine: openai
    model: gpt-4

rails:
  input:
    flows:
      - check jailbreak
      - mask sensitive data
    scanners:
      - secrets
      - prompt_injection
      - toxicity

  output:
    flows:
      - self check facts
      - self check hallucination
    scanners:
      - sensitive
      - toxicity
      - bias

  config:
    sensitive_data_detection:
      input:
        entities:
          - PERSON
          - EMAIL_ADDRESS
          - PHONE_NUMBER
          - CREDIT_CARD

Python Configuration

from ultraguard import LLMRails
from ultraguard.config import RailsConfig

config = RailsConfig(
    input_scanners=['secrets', 'prompt_injection', 'toxicity'],
    output_scanners=['sensitive', 'bias', 'toxicity'],
    cache_enabled=True,
    tracing_enabled=True,
)

rails = LLMRails(config=config)

CLI

# Scan text
ultraguard scan "Check this text" --scanners toxicity,secrets

# Start API server
ultraguard server --port 8000

# Interactive chat
ultraguard chat --config ./config

# Run evaluation
ultraguard eval --dataset ./tests/data

# List available scanners
ultraguard list-scanners

REST API

Start the server:

ultraguard server --port 8000

Endpoints

# Health check
GET /health

# Scan text
POST /scan
{
    "text": "Check this text",
    "scanners": ["toxicity", "secrets"]
}

# Chat completions
POST /v1/chat/completions
{
    "messages": [
        {"role": "user", "content": "Hello!"}
    ]
}

Advanced Usage

Streaming with Guardrails

from ultraguard import LLMRails

rails = LLMRails(config={'input_scanners': ['prompt_injection']})

async def stream_response():
    async for chunk in rails.stream_async([
        {'role': 'user', 'content': 'Tell me a story'}
    ]):
        print(chunk, end='', flush=True)

import asyncio
asyncio.run(stream_response())

LangChain Integration

from langchain_openai import ChatOpenAI
from ultraguard import LLMRails
from ultraguard.integrations.langchain import RunnableUltraGuard

llm = ChatOpenAI(model='gpt-4')

rails = LLMRails(
    config={'output_scanners': ['sensitive', 'toxicity']},
    llm=llm,
)

# Use as a Runnable
chain = RunnableUltraGuard(rails)
result = chain.invoke([{'role': 'user', 'content': 'Hello!'}])

Distributed Tracing

from ultraguard.tracing import TracingConfig, TracingProvider, configure_tracing

config = TracingConfig(
    enabled=True,
    provider=TracingProvider.OPENTELEMETRY,
    endpoint='http://localhost:4317',
)
configure_tracing(config)

Embedding Providers

from ultraguard.embeddings import OpenAIEmbeddings, SentenceTransformersEmbeddings

# OpenAI embeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectors = await embeddings.embed(["Hello world"])

# Sentence Transformers (local)
embeddings = SentenceTransformersEmbeddings(model="all-MiniLM-L6-v2")
vectors = await embeddings.embed(["Hello world"])

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

Development Setup

# Clone the repository
git clone https://github.com/Nipurn123/UltraGuard.git
cd UltraGuard

# Create virtual environment
python -m venv venv
source venv/bin/activate

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run linting
ruff check .
ruff format .

License

This project is licensed under the MIT License - see the LICENSE file for details.


Built with ❤️ by 100XPrompt

Metadata

Release files for ultraguard 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ultraguard 0.1.5
File Size Uploaded
ultraguard-0.1.5.tar.gz 251.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ultraguard 0.1.5
File Interpreter ABI Platform
ultraguard-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 577.5 kB

Release files / ultraguard-0.1.5.tar.gz

Download URL ultraguard-0.1.5.tar.gz
Size 251.9 kB
Tags Source
SHA-256 checksum
How to use checksums
a18b8ecae1124a58ea4536bed56f348a51f02d6ecf2ced28ebe83a29e1d5343a
BLAKE2b-256 checksum
How to use checksums
e32d73d669fd2156943d9482a7a0fa099abd33614d3acb7efbfb6ce91da318bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.10

Release files / ultraguard-0.1.5-py3-none-any.whl

Download URL ultraguard-0.1.5-py3-none-any.whl
Size 325.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
09752cac2a2b88d48ad6a867e8d459a136d61b12bfbe70ffa61429d655253f89
BLAKE2b-256 checksum
How to use checksums
17158a9d771632567525ccf846ef33e927c0f80a1b049e6c3e82318ec2d407d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.10

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page