Research · 08

Omnichannel AI Agents

A business should not need four disconnected AI systems for phone, website, chat and email. The interesting part is not the channel adapters - it is the shared context and the identity resolution underneath them.

  • A single agent definition behind several channel adapters
  • Shared knowledge, memory and business logic
  • Identity resolution across phone number, session and address
  • Per-channel affordances without per-channel forks
  • CRM, calendar and back-office integration as tools
  • Consistency testing across interfaces

This is the area the rest of the lab points at. A business should not need separate AI systems for phone, website, chat and messaging - but the reason that is hard is not the channel adapters. It is everything the adapters would have to share. The architecture below is the one implemented by bitpull.ai, which is what keeps this from being a whiteboard exercise.

Customer
PhoneWeb voiceWeb chatMessaging
Agent layer

One agent definition - instructions, tools, guardrails

KnowledgeMemoryBusiness logicTool registry
Systems of record
CRMCalendarERPTicketingE-commerce
Adapters above the line, everything that decides behaviour below it.

The adapter boundary

An adapter owns exactly four things: transport, the timing model of its channel, the output affordances it can express, and the identity evidence it can report. That list is complete, and the discipline is in keeping it complete. The moment a business rule appears inside an adapter, the channels begin to diverge - quietly, because nobody tests the phone answer against the chat answer.

The agent produces one reply; adapters render it. A phone adapter speaks it and discards the attachment; a chat adapter shows the attachment as a card. What an adapter must never do is ask for a different answer.

Identity is the actual research problem

Sharing knowledge, tools and guardrails across channels is straightforward. Sharing *memory* requires deciding that two conversations belong to the same person, and the evidence for that is much weaker than product discussions assume. A caller ID is a hint, not a login: numbers are spoofed, phones are shared, businesses call from a switchboard.

ChannelEvidenceStrength
Authenticated web sessionLoginStrong
Verified callbackWe dialled a stored numberGood
MessagingAccount handleModerate
Inbound callCaller IDWeak
Web widgetCookie / deviceWeak
Evidence quality by channel. Only the first row is authentication.
Verify, do not volunteer

Below a confidence threshold the agent may ask whether this is about Monday's enquiry once given a reason to - but it may never open by reciting what it remembers. Confident recall from an unauthenticated channel reads as surveillance even when it is correct, and callers are measurably more forgiving of a verifying question than of an agent that knows too much.

Memory tiers and where they live

  1. Turn state - never crosses a channel boundary; dies with the session.
  2. Episode summary - shared, but only above the identity-confidence threshold.
  3. Durable facts - held in the system of record and read through a tool, never in an agent-private store.

The third rule is the one that pays off later: when a customer exercises a deletion right there is exactly one place to delete from. It is close to impossible to retrofit.

Consistency testing

The characteristic failure of a multi-channel system is silent divergence: the phone agent and the chat agent start giving different answers, and nobody notices until a customer says so. The defence is mechanical - run a fixed question set through every adapter on a schedule and diff the answers. Differences in phrasing are fine; differences in fact are a build failure, and encoding that distinction in an automated check is the real engineering.

Open questions

  • How should identity confidence be calibrated rather than hand-set - and should the thresholds differ by industry, as they almost certainly should?
  • What does consent for cross-channel recall look like as a first-class piece of evidence, not a checkbox?
  • How do you keep an asynchronous channel's stale context from being applied confidently when a thread resumes?