Not another chatbot: we built an open-source agent harness for customer service
Description and use
Ecbot is an open‑source agent harness for customer service that addresses platform retry issues, message bursts, stale replies, multi‑channel identity, and escalation to humans.
Problem
Customer service bots often lack robust handling of platform retries, burst messaging, stale replies, multi‑channel identity, and escalation, leading to lost messages, duplicated work, stale responses, fragmented customer data, and uncontrolled handoffs.
Outcome
Ecbot reduces message loss, eliminates duplicate processing, ensures timely and relevant replies, unifies customer identity across channels, and provides clear escalation paths, all without vendor lock‑in.
Workflow
- 1. Receive webhook and write message to BullMQ job before acknowledging. 2. Deduplicate using Redis SET NX on platform:externalMessageId. 3. Debounce bursts: collapse messages arriving within 3 s. 4. Increment generation lease counter for each inbound message. 5. Generate reply with LLM; abort if lease counter changes. 6. Route reply through originating contact point. 7. Escalate to operator if handoff keyword, low confidence, guardrail flag, or trigger tag detected. 8. Operator replies from shared inbox; bot resumes after resolution.
Evidence
Ecbot writes every incoming message to a durable BullMQ job (Redis with AOF on) before it acknowledges the webhook.
Ecbot collapses messages that arrive inside a 3‑second window into one debounce burst and replies once, to all of them, while the platform shows a typing indicator.
For that case each conversation has a generation lease: a counter in Redis. Every inbound message increments it.
Ecbot separates the Customer from the ContactPoint (one platform identity, unique on (workspace, platform, externalSenderId)).
Ecbot's escalation fires when the customer asks for a human, the agent's confidence drops below a threshold, an input guardrail flags the message, or a customer tag triggers handoff.
- Record date: 2026-10-02T08:55:44.740Z