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.

Built With

Share this project:

Updates

posted an update —

Shared Haggle on LinkedIn

Posted about the build, the real story, including the bugs I hit along the way (rate limits, a one-character templating bug, cloud billing as student with no card(I do have it now)), not just the finished result.

[Read the LinkedIn post] https://www.linkedin.com/feed/update/urn:li:activity:7500867652941410306/

Posted as part of my submission to the All Things Agentic Hackathon.

AllThingsAgenticHackathon

Log in or sign up for Devpost to join the conversation.

Submission history