NetworkChains:
AI sales & relationship platform
A network relationship-management platform where I built the AI layer — a sales copilot, a realtime call assistant, a relationship graph and conversational image editing, over a shared retrieval stack.
Commercial product — the AI features sit behind sign-in.
CORE CAPABILITIES
Agentic Sales Copilot
EarnGPT — a five-round tool loop over exactly two tools, with a seven-layer prompt stack behind it.
Realtime Call Assist
EarnGPT Live — dual-stream capture and per-source transcription, streaming suggestions while the call is still running.
Relationship Graph
Synapse — objective person facts kept separate from each user's subjective relationship, with closeness scoring on top.
Conversational Image Editing
Every edit lands as a new revertible version, driven through an async job queue.
Six Scoped Corpora
Six purpose-scoped Qdrant collections rather than one shared index, so each retrieval pass carries its own filters.
Retrieval Beyond kNN
Contextual retrieval, HyDE expansion, reciprocal rank fusion with recency decay, hybrid dense and lexical search, then an LLM rerank.
Architecture
No product screenshots — this is a backend system. The diagrams below are the system itself.

Figure 01 — Four AI subsystems over one retrieval layer.
Open full size ↗
Figure 02 — Dual-stream capture and per-source transcription.
Open full size ↗
Figure 03 — Seven-layer prompt assembly.
Open full size ↗01 — EarnGPT
Agentic sales copilot
SEVEN PROMPT LAYERS
Standing relationship model
The persistent model of how this seller sells.
Memory slots
Bounded, structured facts carried between turns.
Working memory
Verbatim recent context for the active thread.
RAG — chat history
Retrieval pass over prior chat messages.
RAG — documents
Retrieval pass over uploaded documents.
RAG — enriched profile
Retrieval pass over the org-global contact profile.
Deterministic blocks
Sequence state, rebuttal library, strategies and pipeline stage.
LOOP & GUARDRAILS
Two tools, five rounds
search_catalog, where the model writes its own query, and draft_pitch — capped at five tool rounds.
Model allowlist
Anything outside the allowlist is silently coerced back to the default, so a stale client cannot escalate cost.
~96,000 → ~1,500–2,500 tokens
Worst-case prompt input per turn, after the layered assembly replaces naive context stuffing.
Three separate RAG passes — chat history, uploaded documents and the enriched profile — are assembled alongside deterministic blocks, so each pass can carry its own filters instead of sharing one index.
02 — EarnGPT Live
Realtime call assist
AUDIO PIPELINE
Dual-stream capture
The host microphone and a mix of every remote LiveKit participant, captured as two separate streams.
AudioWorklet downsampling
48kHz to 16kHz mono PCM16, shipped in 250ms batches off the main thread.
One socket per source
A dedicated Deepgram nova-3 socket per stream, so speaker attribution comes from the transport rather than a diarization model.
KeepAlive every 5s
Deepgram closes idle sockets, so silent streams are kept warm.
Two-tier hash dedupe
Separate cache keys per loop, so the suggestion interval can run at one second with roughly flat cost.
Token-streamed output
Chat streams token by token over the WebSocket back to the client.
THREE INDEPENDENT LOOPS
Suggestions — every 1s
The hot loop, running against the live transcript.
Rolling summary — every 60s
Whole-transcript summary, recomputed on its own interval.
Action items — every 30s
Extracted commitments, independent of the other two.
The loops run on independent intervals, so a slow summary never stalls the hot suggestion loop.
03 — Synapse
The relationship graph
Objective vs subjective
Person facts are stored once; each user's read on the relationship is stored separately against them.
Closeness scoring
A score over the relationship, derived from the accumulated signal.
Background summariser
An LLM keeps a per-relationship summary current under debounce, a TTL and daily caps.
Verified quotes
Quotes are checked by exact substring match, with a cosine fallback when the match fails.
04 — Image Editor
Conversational image editing
Edits as versions
Every edit produces a new version rather than mutating the image, so any step is revertible.
Async job queue
Edits are driven through a queue rather than held open on the request.
The editing surface is conversational — the user describes the change, and the version history is the record of what was asked.
Shared layer
One retrieval stack under all four
SIX QDRANT COLLECTIONS
voice_memos
Recorded seller voice notes.
earngpt_messages
Chat-message memory for recall across turns.
earngpt_documents
Filtered on userId AND contactId — a strict double filter as the security primitive.
axon_profile
Org-global enriched contact profile.
synapse_replica
The standing relationship model.
webinar_transcripts
Transcript corpus for supporting material.
Each 1536-d, text-embedding-3-small.
RETRIEVAL BEYOND kNN
Contextual retrieval
An LLM-written blurb is prepended before embedding, improving recall on terse turns.
HyDE expansion
A hypothetical answer is embedded instead of the bare query.
Reciprocal rank fusion
Fuses ranked lists under a 14-day exponential recency half-life.
Hybrid search
Dense vectors combined with lexical matching.
LLM rerank
Final reranking over the fused candidate set.
TECHNICAL ARCHITECTURE
backend
Node + TypeScript
Express contacts-backend
MongoDB
Primary datastore
BullMQ on Redis
Async job fan-out and image-edit queue
realtime
Python + FastAPI
Copilot service
LangGraph
Orchestrates the background loops
Deepgram + LiveKit
One nova-3 socket per audio source
retrieval
Qdrant
Six purpose-scoped collections
text-embedding-3-small
1536-dimensional across all six
FastAPI catalog index
Serves the search_catalog tool