Conversational AI Agents: Reply to Conversations, Not Messages

In the last post we built the engine: a Postgres row per attached agent, next_run_at as the scheduler, a lease for crash safety. This post is about the loop that runs on top of it, how a WhatsApp lead-qualification agent at a CRM for small businesses decides when to speak, when to wait, and when to shut up. The agent’s job is simple to state: a lead messages a business (say, a car dealership), the agent attaches to the conversation, works through a configured list of qualification questions (which model, what timeline, what budget, trade-in, test-drive day) and detaches when it is done or when a human takes over. The LLM parts (extraction, confidence scores, prompt defenses) are the next post. This one is about everything around the LLM, which is where the product actually lives. ...

July 9, 2026 · Pranav Gore

We Didn't Need Temporal: Durable Agent Runs on Postgres and Celery

We recently shipped long-running conversational agents at a CRM for small businesses. An agent attaches itself to a WhatsApp conversation and works it for hours or days: wake up, look at the conversation, maybe send a message, decide when to wake up next, go back to sleep. Eventually it finishes, or a human takes over, or the lead goes quiet, or something breaks. When we sketched the requirements, they read like a brochure for a workflow engine: ...

July 3, 2026 · Pranav Gore