I built Laddu, also called AgenticAI-ChatWidget, as an agentic AI shopping assistant for the demo sweet shop Paddu’s Sweets. The repository contains the widget and agent, not the shop’s website; the widget is intended to plug into a website with two tags. I started the Python project in 2026-09 and last updated it in 2026-09. Laddu is portrayed as a cute traditional Indian boy who greets customers by name. I describe it among my projects on my github profile.
I built the agent from scratch to demonstrate how agentic AI works, without LangChain or another agent framework. It combines Sarvam AI’s sarvam-105b, tools, a hand-written agent loop, MongoDB memory, a FastAPI backend, and a lightweight vanilla JavaScript widget. The README’s terminal example shows the model being called with 8 tools.
When a customer sends a message, the browser widget posts it to /api/chat. chat_api.py loads recent conversation history and the system prompt from prompt.py, then calls run_agent() in agent.py. The agent calls Sarvam through llm.py; when the model requests a tool, Laddu’s server runs it through tools.py and appends its result to the conversation. The API saves the exchange and returns the reply, agent steps, and whether the cart changed.
- I expose eight tools:
search_products,get_product_details,get_shop_info,view_cart,add_to_cart,place_order,get_my_orders, andrequest_callback. Search tolerates spelling mistakes and uses live prices and stock; order placement requiresconfirmed=trueafter a summary. The server derives the customer from the login token, calculates prices and totals, and reserves stock atomically. The hand-written agent loop stops after 6 rounds; the model selects tools but does not execute code.
I store every message, including hidden tool calls and results, in MongoDB’s conversations collection, but send only the last 24 messages to the AI. Each visit starts a fresh chat; earlier chats and orders can inform four personal suggestion chips, cached in laddu_memory so suggestions are regenerated only when there is new input. The shop website provides collections for products, users, sessions, carts, orders, site content, shop information, and categories; Laddu adds conversations and laddu_memory.
- I can customize Laddu’s personality and rules in
prompt.pyviabuild_system_prompt(), suggestion writing viabuild_suggestions_prompt(), and tools intools.pywith their descriptions inprompt.py. I set the Sarvam model withSARVAM_MODEL, appearance inwidget.css, default greeting and chips throughsite_content’sladdu_*fields (with defaults inprompt.py), and chat expiry withCHAT_IDLE_MINUTESinchat_api.py. The demo has no rate limiting and uses a simple shared admin password.
python -m venv venv
pip install -r requirements.txt
# Set MONGODB_URI and SARVAM_API_KEY in .env
python app.py
python app.py chat customer@example.com --no-memory
python app.py chat customer@example.com --raw
- I use database-backed tools for product prices, stock, timings, and orders instead of having the agent invent those details. The README names
search_productsfor product search andadd_to_cartfor adding items to the real website cart; it also describes order-status answers and callback requests. - Each visit starts a fresh chat, while suggestion chips are written using previous chats and orders. Example suggestions include “Track order PS-1001” and “Order Motichoor Ladoo again.”
The README includes a terminal demonstration run with python app.py chat nitin@example.com. The greeting says, “Laddu is ready! Chatting as Nitin. Memory is ON. Type 'exit' to quit.” In the example, the first request sends 2 messages with 8 tools and returns finish_reason=tool_calls (prompt=1746, completion=52 tokens). Laddu calls search_products with {"query": "kaju katli"}; the second request sends 4 messages with 8 tools and returns finish_reason=stop (prompt=1894, completion=1888 tokens). The response lists Kaju Katli at ₹720 / 500g and Royal Mithai Box at ₹1199 / box.
The README says its screenshots show real Sarvam AI replies using a test copy of the shop’s data, with no real customer data, and are unedited. It includes a mobile screenshot at screenshots/07-mobile.png, displayed at width 320. The supplied project description does not explain the database schema, deployment setup, API endpoints, two-tag embedding implementation, or the detailed implementations of the step limit, safe HTML, spelling tolerance, and language handling.
- Conversations are saved for the shop owner with timestamps and the tools used; the README points to Admin → Laddu Chats.
- Laddu greets customers by name. The example is “Hi Nitin, I’m Laddu! 👋 I’m here to assist you.”
- Product choices can be numbered and tapped: the “i want laddu” example lists ladoos numbered 1–6. The README gives spelling-tolerant search examples “mothichur” → Motichoor Ladoo and “rawa” → Rava Ladoo.
- Replies are described as matching the customer’s language, with English, Hindi, Hinglish, and Telugu listed. The chat becomes full-screen on phones.
- The widget adds products to the same cart as the website, with the page’s cart count updating instantly. For example, choosing “5, 2 packs” changes the displayed cart count to 2.
- For ordering, Laddu checks the cart, shows a summary, asks whether to place the order, and places it only after an explicit “yes”; the README says this is enforced in code. Its example order is PS-1001.
- Tools are restricted to the logged-in customer. The README also lists a step limit, safe HTML, and explaining errors rather than crashing as guardrails.