Tether is a multi-modal Retrieval-Augmented Generation (RAG) system for searching workplace meetings and internal documents with precise source attribution.
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.
- 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
- 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
- Python 3.10 or higher
- Docker (for Qdrant)
- 8GB RAM minimum (16GB recommended)
- Groq API key
git clone <repository-url>
cd tetherpython -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activateWith uv:
uv sync --extra devOr with pip:
pip install --upgrade pip
pip install -e ".[dev]"docker run -d -p 6333:6333 -v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrantVerify Qdrant is running:
curl http://localhost:6333/healthcp .env.example .envEdit .env and add your Groq API key:
GROQ_API_KEY=your_groq_api_key_hereOptional: Add HuggingFace token for speaker diarization:
ENABLE_DIARIZATION=true
HF_TOKEN=your_huggingface_token_hereIf you want the optional diarization dependency installed, use:
uv sync --extra dev --extra diarizationCreate the directory structure and add your files:
mkdir -p data/workspace/documents
mkdir -p data/workspace/meetingsPlace your files:
- PDFs in
data/workspace/documents/ - Meeting audio files (MP3, WAV, M4A) in
data/workspace/meetings/
python scripts/ingest.pyThis 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!
============================================================
Start the Streamlit app:
streamlit run streamlit_app/app.pyNavigate to http://localhost:8501 in your browser.
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_00Interactive mode:
python scripts/query.py --interactivepython scripts/evaluate.pyThis generates a quality report with RAGAS metrics in outputs/evaluation_report.json.
pytest tests/ -v- "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."
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.
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
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.