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.
FOUR SUBSYSTEMS
01 — EarnGPT
Agentic sales copilot
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.
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.
02 — EarnGPT Live
Realtime call assist
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, rolling summary every 60s, action items every 30s — a slow summary never stalls the hot 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 BullMQ queue rather than held open on the request.
Conversational surface
The user describes the change, and the version history is the record of what was asked.
The copilot's seven prompt layers include three separate RAG passes — chat history, uploaded documents and the enriched profile — assembled alongside deterministic blocks, so each pass carries its own filters instead of sharing one index.
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

