Skip to main content

Kryten LLM

AI-powered chat bot service for CyTube, part of the Kryten ecosystem.

Features

  • Trigger-Based Responses: Configurable trigger words with probabilities
  • Direct Mentions: Responds when mentioned by name
  • LLM Integration: Multiple LLM provider support (OpenAI, OpenRouter, local)
  • Rate Limiting: Per-user, per-trigger, and global rate limits
  • Spam Detection: Automatic spam detection with exponential backoff penalties
  • Context Awareness: Tracks chat history and video context
  • Hot-Reload: Reload configuration without restart (SIGHUP)
  • Service Discovery: Publishes heartbeats and responds to discovery polls
  • Dry-Run Mode: Test responses without sending to chat

Requirements

  • Python 3.10+
  • Poetry
  • NATS server
  • kryten-py library

Installation

Using Poetry

# Install dependencies
uv sync

# Copy example configuration
cp config.example.json config.json

# Edit configuration with your settings
# See config.example.json for all options

Using pip

pip install kryten-llm

Configuration

Configuration is stored in a JSON file. See config.example.json for a complete example.

Key Sections

Section Description
nats NATS connection settings
channels CyTube channel connections
personality Bot character and behavior
llm_providers LLM API configurations
triggers Trigger words with patterns and probabilities
rate_limits Rate limiting rules
spam_detection Spam detection settings
testing Dry-run and logging options

Environment Variables

Override configuration with environment variables:

export OPENROUTER_API_KEY="your-api-key"
export KRYTEN_LLM_DRY_RUN="true"

Usage

Running the Service

# Using Poetry
uv run kryten-llm --config config.json

# Direct Python execution
python -m kryten_llm --config config.json

Command Line Options

Option Description
--config PATH Path to configuration file (default: config.json)
--log-level LEVEL Logging level: DEBUG, INFO, WARNING, ERROR
--dry-run Generate responses but don't send to chat
--validate-config Validate configuration and exit

Validation Mode

Validate your configuration without starting the service:

uv run kryten-llm --config config.json --validate-config

Dry-Run Mode

Test responses without sending to chat:

uv run kryten-llm --config config.json --dry-run

Hot-Reload (POSIX)

Reload configuration without restarting the service:

# Send SIGHUP to reload configuration
kill -HUP $(pgrep -f kryten_llm)

Safe changes that can be hot-reloaded:

  • Triggers (patterns, probabilities, enabled status)
  • Rate limits
  • Spam detection settings
  • Personality configuration
  • LLM provider settings

Unsafe changes (require restart):

  • NATS connection settings
  • Channel configuration
  • Service name

Production Deployment

Systemd Service

Install the systemd service file:

# Copy service file
sudo cp kryten-llm.service /etc/systemd/system/

# Create config directory
sudo mkdir -p /etc/kryten-llm
sudo cp config.json /etc/kryten-llm/

# Create log directory
sudo mkdir -p /var/log/kryten-llm
sudo chown kryten:kryten /var/log/kryten-llm

# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable kryten-llm
sudo systemctl start kryten-llm

Service Management

# Check status
sudo systemctl status kryten-llm

# View logs
sudo journalctl -u kryten-llm -f

# Reload configuration
sudo systemctl reload kryten-llm

# Restart service
sudo systemctl restart kryten-llm

Development

Running Tests

# Run all tests
uv run pytest

# Run with coverage
uv run pytest --cov=kryten_llm

# Run specific test file
uv run pytest tests/test_trigger_engine.py -v

Code Quality

# Linting
uv run ruff check .

# Formatting
uv run black .

# Type checking
uv run mypy kryten_llm

Architecture

The service processes messages through a pipeline:

Chat Message
    ↓
MessageListener (parse/filter)
    ↓
TriggerEngine (detect triggers/mentions)
    ↓
RateLimiter (check rate limits)
    ↓
SpamDetector (check spam)
    ↓
ContextManager (gather context)
    ↓
PromptBuilder (build LLM prompt)
    ↓
LLMManager (call LLM API)
    ↓
ResponseValidator (validate response)
    ↓
ResponseFormatter (format for chat)
    ↓
Send to Chat

Service Discovery

The service publishes lifecycle events via kryten-py's built-in ServiceConfig:

  • Startup event: When service connects to NATS
  • Heartbeat: Every 10s (configurable via heartbeat_interval_seconds) with health status
  • Shutdown event: When service stops gracefully

All lifecycle events use the kryten.lifecycle.<service>.<event> subject pattern:

  • kryten.lifecycle.llm.startup
  • kryten.lifecycle.llm.heartbeat
  • kryten.lifecycle.llm.shutdown

License

MIT License - see LICENSE for details.

Release files for kryten-llm 0.10.20

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

Source distribution (sdist)

Source distribution for kryten-llm 0.10.20
File Size Uploaded
kryten_llm-0.10.20.tar.gz 882.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kryten-llm 0.10.20
File Interpreter ABI Platform
kryten_llm-0.10.20-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / kryten_llm-0.10.20.tar.gz

Download URL kryten_llm-0.10.20.tar.gz
Size 882.1 kB
Tags Source
SHA-256 checksum
How to use checksums
bc0581d70118868465e44724919b4b327c2eac885dfbe09763f7853035d7ba6d
BLAKE2b-256 checksum
How to use checksums
9d12844bf88474db50c59783adf5ef778c91da7d7b7c5ff0e1b447bb2f0e66c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / kryten_llm-0.10.20-py3-none-any.whl

Download URL kryten_llm-0.10.20-py3-none-any.whl
Size 183.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5d4535b701624287687fa7ff1d127fb3d74f79fa366a493dfb873967f8b1a346
BLAKE2b-256 checksum
How to use checksums
0ba2fdc3065a237348d64ef50a32b54ee69aacdbd4742996ade299dec8a7e0ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release history Release notifications | RSS feed

0.11.1

2 release files

This release

0.10.20 This release

2 release files

0.10.1

2 release files

0.9.4

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.8.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.2

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.1.1

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