Skip to content

DejusDevspace/tether

Repository files navigation

Tether - Source-Grounded Workplace Memory

Tether is a multi-modal Retrieval-Augmented Generation (RAG) system for searching workplace meetings and internal documents with precise source attribution.

Overview

Tether turns meeting recordings and documents into a searchable organizational memory layer. Teams can ask who said what, recover decisions, find action items, and verify facts against timestamped meeting transcripts and document citations.

Key Features

  • Multi-Modal Search: Unified search across meeting audio and internal documents
  • Hybrid Retrieval: Combines keyword search (BM25) with semantic vector search for accurate recall
  • Speaker-Aware Evidence: Preserves speaker labels and meeting timestamps for "who said what" queries
  • Precise Citations: Every answer includes source attribution, including document pages and audio timestamps
  • Quality Evaluation: Built-in RAGAS metrics for faithfulness and relevance scoring

Technology Stack

  • LLM: Groq API
  • Embeddings: Sentence Transformers (all-MiniLM-L6-v2, local)
  • Vector Database: Qdrant
  • Transcription: OpenAI Whisper (local)
  • Speaker Diarization: pyannote.audio
  • Web Interface: Streamlit

Installation

Prerequisites

  • Python 3.10 or higher
  • Docker (for Qdrant)
  • 8GB RAM minimum (16GB recommended)
  • Groq API key

Setup Steps

1. Clone Repository

git clone <repository-url>
cd tether

2. Create Virtual Environment

python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

3. Install Dependencies

With uv:

uv sync --extra dev

Or with pip:

pip install --upgrade pip
pip install -e ".[dev]"

4. Start Qdrant Vector Database

docker run -d -p 6333:6333 -v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrant

Verify Qdrant is running:

curl http://localhost:6333/health

5. Configure Environment

cp .env.example .env

Edit .env and add your Groq API key:

GROQ_API_KEY=your_groq_api_key_here

Optional: Add HuggingFace token for speaker diarization:

ENABLE_DIARIZATION=true
HF_TOKEN=your_huggingface_token_here

If you want the optional diarization dependency installed, use:

uv sync --extra dev --extra diarization

6. Prepare Workspace Data

Create the directory structure and add your files:

mkdir -p data/workspace/documents
mkdir -p data/workspace/meetings

Place your files:

  • PDFs in data/workspace/documents/
  • Meeting audio files (MP3, WAV, M4A) in data/workspace/meetings/

7. Ingest Workspace Content

python scripts/ingest.py

This will:

  • Extract text from PDFs and chunk with metadata
  • Transcribe meeting audio with Whisper while preserving timestamps
  • Perform speaker diarization if enabled
  • Generate embeddings and index content in Qdrant

Expected output:

============================================================
INGESTION SUMMARY
============================================================
PDFs processed:     1
Audio processed:    1
Total chunks:       156

All files processed successfully!
============================================================

Usage

Web Interface

Start the Streamlit app:

streamlit run streamlit_app/app.py

Navigate to http://localhost:8501 in your browser.

Command Line Interface

Single query:

python scripts/query.py --query "What did we decide about the launch timeline?"

With filters:

python scripts/query.py \
  --query "What did Alex say about onboarding?" \
  --response-mode who_said_what \
  --mode hybrid \
  --filter-source audio \
  --filter-speaker SPEAKER_00

Interactive mode:

python scripts/query.py --interactive

Run Evaluation

python scripts/evaluate.py

This generates a quality report with RAGAS metrics in outputs/evaluation_report.json.

Run Tests

pytest tests/ -v

Example Questions

  • "Who suggested delaying the release?"
  • "What did we decide about pricing?"
  • "What action items came out of the onboarding meeting?"
  • "Which document supports the API rate-limit decision?"
  • "Summarize all discussions about customer migration risk."

Response Modes

Tether supports task-specific answer modes:

  • answer: General source-grounded Q&A.
  • who_said_what: Speaker-aware recall with timestamped citations.
  • decisions: Decision extraction and rationale.
  • action_items: Task, owner, and due-date extraction from indexed sources.
  • fact_check: Support, contradiction, or insufficient-evidence checks against meetings and documents.

Project Structure

tether/
├── config/              # Configuration settings
├── src/
│   ├── ingestion/       # PDF and audio processing
│   ├── storage/         # Vector database wrapper
│   ├── retrieval/       # Hybrid search engine
│   ├── generation/      # RAG answer generation
│   ├── evaluation/      # Quality metrics
│   └── utils/           # Logging and error handling
├── scripts/             # CLI tools (ingest, query, evaluate)
├── streamlit_app/       # Web interface
├── tests/               # Unit tests
├── data/                # Workspace files (not in repo)
└── outputs/             # Query results and reports

Portfolio Positioning

Tether is not positioned as a generic meeting summarizer. It is an evidence-first workplace memory system:

Every workplace answer, tethered to its source.

The goal is to recover decisions, action items, and facts from meeting recordings and internal documents with transparent citations and measurable answer quality.

About

Tether turns meeting recordings and documents into a searchable organizational memory layer. Teams can ask who said what, recover decisions, find action items, and verify facts against timestamped meeting transcripts and document citations.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages