Skip to main content

🧶 Ragdoll

Retrieval-Augmented Generation Driven by Offline Local LLMs

A fully-local RAG system that ingests JIRA tickets, PDF documents, and Python source code, indexes them for semantic search, and connects to a local LLM via Ollama for interactive Q&A, summarization, and chat.

Privacy-first: All data stays on your machine — nothing is sent to external services by default.

Key Features

  • Multi-source ingestion — PDF, JIRA, Bitbucket, GitHub, Git, and Python code (AST-parsed)
  • Semantic search — ChromaDB vector store with cosine similarity
  • Local LLM — Ollama-powered embedding and generation
  • Interactive chat — Multi-turn RAG chat with persistent history
  • MCP Server — First-class support for the Model Context Protocol (stdio & sse). (Note: If you connect a cloud-based AI client to this MCP server, the search results it retrieves will be sent to that external AI provider).
  • Privacy-first — Everything runs locally; no external API calls
  • Flexible configuration — 4-layer precedence (env → project → user → defaults)

Prerequisites

  • Python 3.12+
  • Ollama running locally with:
    • An embedding model (e.g. nomic-embed-text)
    • A chat model (e.g. gpt-oss:20b, deepseek-r1:32b)
  • pixi for environment management

Quick Start

# Clone and enter the project
cd ragdoll

# Install with pixi (creates isolated env + editable install)
pixi install

# Set up user-level configuration
mkdir -p ~/.ragdoll && chmod 700 ~/.ragdoll
cat > ~/.ragdoll/config.toml << 'EOF'
jira_url = "https://your-jira.example.com"
jira_user = "your.user"
jira_token = "YOUR_PAT_TOKEN"
jira_auth_method = "pat"  # "pat" for JIRA Data Center, "basic" for Cloud

bitbucket_url = "https://your-bitbucket.example.com"
bitbucket_user = "your.user"
bitbucket_token = "YOUR_HTTP_ACCESS_TOKEN"
bitbucket_auth_method = "pat"

github_token = "YOUR_GITHUB_PERSONAL_ACCESS_TOKEN"
EOF
chmod 600 ~/.ragdoll/config.toml

# Check everything is connected
pixi run ragdoll status

Usage

Ingest Data

# Ingest PDF files or directories
pixi run ragdoll ingest pdf ./docs/technical_handbook.pdf
pixi run ragdoll ingest pdf ./reports/

# Ingest JIRA issues via JQL
pixi run ragdoll ingest jira --jql "project = CORE AND updated >= -30d"
pixi run ragdoll ingest jira --jql "project = AUTH AND updated >= -60d" --max-results 100

# Ingest from a different JIRA instance (multi-site)
pixi run ragdoll ingest jira \
  --url https://other-jira.example.com \
  --token OTHER_PAT \
  --jql "project = EXT AND updated >= -30d"

# Ingest Bitbucket Pull Requests and comments
pixi run ragdoll ingest bitbucket --project PROJ --repo backend --state ALL

# Ingest GitHub Issues and PR discussions
pixi run ragdoll ingest github myorg myrepo --state all

# Ingest Python source code (AST-parsed per function/class)
pixi run ragdoll ingest code ./src/
pixi run ragdoll ingest code ./path/to/project/

Reingesting Data (LlamaIndex Update)

If you are upgrading from an older version of ragdoll to the LlamaIndex-backed version, your existing ChromaDB data is fully backward compatible. However, it is highly recommended to wipe the old index and reingest your data to take advantage of LlamaIndex's superior semantic chunking (which splits by sentences instead of fixed character limits).

To clear your database and start fresh:

# Delete the old ChromaDB collection
rm -rf ~/.ragdoll/data/chroma

# Re-run your ingestion commands
pixi run ragdoll ingest jira --jql "project = CORE AND updated >= -30d"
pixi run ragdoll ingest pdf ./docs/
# Semantic search across all ingested data
pixi run ragdoll search "tclean performance regression"
pixi run ragdoll search "AsdmStMan lazy import" --source jira
pixi run ragdoll search "calibration pipeline" --source pdf -n 5
pixi run ragdoll search "embedding function" --source code

Summarize

# Summarize a topic from ingested data
pixi run ragdoll summarize "What are the known issues with AsdmStMan?"
pixi run ragdoll summarize "tclean parallelization" --source jira

Interactive Chat

# Start an interactive RAG chat session
pixi run ragdoll chat
pixi run ragdoll chat --source jira  # only use JIRA context
pixi run ragdoll chat --source code  # only use source code context

Chat features:

  • Persistent history — arrow-up recalls previous questions across sessions (stored in ~/.ragdoll/chat_history)
  • Line editing — full readline support (backspace, arrows, Home/End)
  • Multi-turn — context accumulates within a session

Configuration

Ragdoll uses a 4-layer precedence configuration strategy:

Priority Source Purpose
1 (highest) RAGDOLL_* environment variables CI/ephemeral overrides
2a ./ragdoll.toml in the project directory Project-level settings
2b ./.env in the project directory Project-level secrets
3 ~/.ragdoll/config.toml User-level defaults & credentials
4 (lowest) Package defaults Hardcoded fallbacks

Settings Reference

Variable / TOML key Default Description
jira_url — JIRA server URL
jira_user — JIRA username
jira_token — JIRA API token or PAT
jira_auth_method pat "pat" for Data Center, "basic" for Cloud
jira_batch_size 50 Issues per API request
ollama_host http://localhost:11434 Ollama API endpoint
embed_model nomic-embed-text Embedding model
chat_model gpt-oss:20b Chat / generation model
temperature 0.3 LLM sampling temperature
data_dir ~/.ragdoll/data ChromaDB storage directory
collection_name ragdoll ChromaDB collection name
chunk_size 1000 Characters per chunk
chunk_overlap 200 Overlap between consecutive chunks
top_k 20 Default retrieval count

Architecture

Source Data                Pipeline                        Storage
───────────                ────────                        ───────
PDF files     ─┐
JIRA tickets  ─┼─→  Ingestor  →  Chunker  →  Embedder  →  ChromaDB
Python code   ─┘              (AST-aware)   (Ollama)       (local)
                                                             ↑
Query Flow                                                   │
──────────                                                   │
CLI / Chat  →  Embed query  →  Retriever  ←──────────────────┘
                                 ↓
                           LLM (Ollama)  →  Streamed answer

Data Sources

Source Module Strategy
PDF ragdoll.ingest.pdf PyMuPDF text extraction → recursive character splitter
JIRA ragdoll.ingest.jira REST API with JQL → structured text per issue
Bitbucket ragdoll.ingest.bitbucket REST API → structured text per PR and comment thread
GitHub ragdoll.ingest.github REST API → structured text per Issue/PR and comment thread
Git ragdoll.ingest.git Commit history extraction across all branches
Code ragdoll.ingest.code AST parsing → one Document per function/class/module docstring

Key Components

  • Config (ragdoll.config) — Pydantic Settings with 4-layer precedence
  • Chunker (ragdoll.ingest.chunker) — Recursive character text splitter
  • Embedder (ragdoll.llm.ollama) — Ollama HTTP client for embeddings and generation
  • Vector Store (ragdoll.store.vectordb) — ChromaDB with cosine similarity
  • Retriever (ragdoll.query.retriever) — Semantic search with source filtering
  • RAG Chain (ragdoll.query.rag) — Context-augmented generation and chat
  • CLI (ragdoll.cli) — Click-based interface with Rich formatting

Documentation

Full documentation is hosted at ragdoll.readthedocs.io.

You can also build the documentation locally from the docs/ directory using Sphinx:

pixi run docs

License

MIT

Metadata

Release files for ragdoll-ai 0.4.4

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

Source distribution (sdist)

Source distribution for ragdoll-ai 0.4.4
File Size Uploaded
ragdoll_ai-0.4.4.tar.gz 225.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ragdoll-ai 0.4.4
File Interpreter ABI Platform
ragdoll_ai-0.4.4-py3-none-any.whl Python 3 none any Details

Total release size: 299.6 kB

Release files / ragdoll_ai-0.4.4.tar.gz

Download URL ragdoll_ai-0.4.4.tar.gz
Size 225.8 kB
Tags Source
SHA-256 checksum
How to use checksums
efe51b33272fd365edefd3378632a853a1c9c6a7bbb8cbbc2c3b0176c9773b02
BLAKE2b-256 checksum
How to use checksums
d45f30a7ead2e3fbc10f030f6ad981e29847b8941b03d2a184aee82d7291583e
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 Sep 16, 2026.

Transparency log

Release files / ragdoll_ai-0.4.4-py3-none-any.whl

Download URL ragdoll_ai-0.4.4-py3-none-any.whl
Size 73.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3c851123c1931abb2cb006d4f22f2afab5425d15de489d02f39b7b9b8d1dff50
BLAKE2b-256 checksum
How to use checksums
069ee885a3b5e4b17c8b0da9b632860df7c85a9b906e5bf9ecd6c7fb808e0581
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 Sep 16, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.5

2 release files

This release

0.4.4 This release

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

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