An Intelligent Procurement Agent built using Google Agent Development Kit (ADK) and Gemini / LiteLLM, designed to manage construction material orders while enforcing site-specific governance rules, persistent memory, and human-in-the-loop approvals.
This project demonstrates how to build enterprise-grade, policy-aware agents with deterministic behavior, resumable execution, and clean separation between orchestration, tools, memory, and UI.
-
Stores site-specific rules such as:
- Approval limits
- Vendor bans
-
Backed by SQLite
-
Survives agent restarts and conversations
- Vendor selection via structured tools (no LLM guesswork)
- Strict enforcement of banned vendors
- Explicit material, quantity, and pricing checks
- Orders exceeding approval limits automatically pause
- Approval / rejection handled declaratively via ADK’s
require_confirmation - Seamless pause → resume workflow
- Uses ADK
ResumabilityConfig - Invocation resumes exactly where it paused after approval
- Streamlit-based chat interface
- Approval buttons for managers
- Live visualization of agent pauses and resumes
User (Streamlit UI)
↓
Supervisor Agent (ADK)
↓
────────────────────────────────
| Tools Layer |
| - Vendor Search |
| - Approval / Confirmation |
| - Memory Persistence |
────────────────────────────────
↓
Persistent Memory (SQLite)
-
SupervisorAgent
- Orchestrates procurement flow
- Calls tools deterministically
- Never leaks reasoning or system logic
-
MemoryRecallAgent
- Retrieves stored site rules
- Uses ADK
LoadMemoryTool
omnagvekar-construction_manager_agent/
├── app.py # Streamlit UI + HITL handling
├── agents/ # ADK agents and app definition
│ ├── Supervisor.py
│ ├── memory_agent.py
│ └── compiled_agent.py
├── tools/ # Deterministic business logic
│ ├── vendor_search.py
│ ├── memory_tools.py
│ └── confirmation.py
├── core/ # Model + settings
│ ├── llm.py
│ └── Setting.py
├── utils/ # Database & session management
│ ├── db_manager.py
│ └── memory_db.py
├── prompts/ # System & memory prompts
├── data/ # Mock vendor data
│ └── mock_vendors.json
└── README.md
Python >= 3.13MacOS/ Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
irm https://astral.sh/uv/install.ps1 | iex
# OR
pip install uvpip install -e .From the project root:
uv venv
# Windows
.venv\Scripts\activate
# Windows (Powershell)
.venv\Scripts\Activate.ps1
# Linux / MacOS
source .venv/bin/activateInstall all dependencies defined in pyproject.toml:
uv pip install -e .
# OR
uv syncCreate a .env file using .env.template:
LLM_MODEL=gemini/gemini-2.5-flash
LLM_API_KEY=your_api_key_here
DB_URL=sqlite+aiosqlite:///agent_memory.db
VENDOR_DATA_DIR=./data/mock_vendors.jsonRun the Streamlit app from the project root:
streamlit run app.pyUser
For the Pune site, the approval limit is 40000 and avoid BadRock Cements.
Agent
Rules for Pune site have been updated.
User
Order 100 bags of cement for the Pune site.
- BadRock is excluded
- Cheapest valid vendor exceeds limit
- Agent pauses
System
Manager approval required.
- Click Approve Transaction → Order executes
- Click Reject Transaction → Order cancelled
- Implemented via ADK
FunctionTool(require_confirmation=...) - No approval logic duplicated in prompts
- Tool layer owns governance
- Purely deterministic JSON filtering
- Supports multiple materials per vendor
- SQLite-backed rule storage
- Flexible schema (semantic key matching for limits)
- No chain-of-thought leakage
- Tool-first execution
- Model-agnostic design
- Clear separation of concerns
- Enterprise-safe defaults
MIT License © 2026 Om Nagvekar
This project was built as part of an AI Engineer / Agentic Systems assessment, showcasing how to design reliable, auditable, and policy-aware agents using the Google ADK ecosystem.