AI Sales Platform

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.

VIEW PRODUCT
Closed source
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.

Four AI subsystems over one retrieval layer

Figure 01 — Four AI subsystems over one retrieval layer.

Open full size ↗
Dual-stream capture and per-source transcription

Figure 02 — Dual-stream capture and per-source transcription.

Open full size ↗
Seven-layer prompt assembly

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