Inspiration
I'm the kind of person who pays for things I know are overpriced. If a subscription is charging way more than it's actually worth compared to the market, I know it and I still just pay it, every single time, because negotiating makes me deeply uncomfortable. I most of the times do not call to bargain a bill down, even when I knew for a fact I was being overcharged.
Haggle exists because I wanted an agent that would do the uncomfortable part for me: research whether I'm actually overpaying, then have that awkward conversation on my behalf, professionally, persistently, and without any of the anxiety I'd feel doing it myself.
What it does
Haggle is a two agent negotiation system. A UserAgent researches real competitor pricing using Google Search grounding, then negotiates round by round against a CounterpartyAgent , an AI playing a subscription service's retention department, complete with a hidden floor price it will never cross. The two agents talk over Google's real A2A (Agent to Agent) protocol, as two independent processes over HTTP, not a single prompt pretending to be two people.
Point it at a list of subscriptions and it negotiates all of them autonomously, then reports total savings. A verified run: three services, three deals reached, $16.00/month saved, $192/year, each negotiation citing different competitors and landing at a different discount, because it's the model reasoning fresh every round, not a script.
How I built it
Google ADK 2.0 for both agents, using Agent, AgentTool, and RemoteA2aAgent
Gemini 3.5 Flash via Vertex AI, using the global endpoint
Google Search grounding for real, current competitor pricing, not hardcoded data
Firestore logs every negotiation's outcome, so the agent has memory across runs, not just within one session
Deployed as a Cloud Run Job, a run to completion batch task, since Haggle negotiates and exits rather than serving live traffic
A separate Cloud Run Service hosts a small read only dashboard reading directly from Firestore
15 automated tests (pytest) covering response parsing and instruction construction, with zero API calls needed
Challenges I ran into
Almost none of the hard parts were about AI, they were about the unglamorous reality of shipping on real infrastructure:
Gemini won't let a single agent mix a built in tool (like google_search) with a custom function tool, required splitting search into its own dedicated sub agent
A onecharacter templating mismatch (.replace() vs .format()) left literal doubled braces in a prompt, which the model then dutifully mimicked in every JSON response, silently breaking my parser
A2A agent cards are self describing — mine was advertising the wrong port entirely, so my readiness check passed every time while real negotiation traffic failed every time, for a reason that took real digging to find
Newer Gemini models aren't always reachable at a specific Vertex AI region — some require the global endpoint specifically, and the 404 you get instead doesn't hint at that at all
Getting Vertex AI billing enabled as a student with no card in my household turned into its own multi day side quest
What's next
Extending the negotiation strategy to be more adaptive mid conversation, and expanding beyond subscriptions to other recurring bills where the "I'm too shy to ask" tax quietly adds up.
Log in or sign up for Devpost to join the conversation.