The negotiation problem, stated cleanly
A negotiation has a set of possible agreements and one distinguished outcome, no-deal. Each agent i has a utility function u_i mapping every agreement to a real number, plus a utility for no-deal. Agents take turns proposing; a deal is struck only when someone accepts a standing offer, and if no one ever accepts, everyone gets their no-deal utility.
Two features make this hard for an LLM. Preferences are private — A does not know how much B values each outcome, so part of the game is inferring it from B’s moves — and the interests conflict: an agent that is too greedy walks away with the no-deal payoff, while one too soft leaves value on the table. Everything below is machinery for that tension: score the outcomes, find where a deal can live, and move through it deliberately.
Utility functions: outcomes to numbers
Before an agent can negotiate it needs a utility function that turns a proposed outcome into a comparable number. For a single-price deal this is often just the price. A common linear form for a buyer with maximum willingness-to-pay v is u_buyer(p) = v − p, and for a seller with cost c, u_seller(p) = p − c.
An explicit u_i makes the agent’s behaviour legible and testable. An LLM asked to ‘get a good deal’ in free text has no anchor; one handed a utility function has a gradient to climb and a number you can log. Give the agent a scoring rule, or elicit one, and hold it fixed so later analysis — welfare, efficiency — refers to the same scale it was optimising.
Reservation values and the walk-away point
The reservation value (or reservation price) is the utility of no-deal — the worst agreement an agent will still accept rather than leave. For a buyer it is the maximum price they will pay; for a seller, the minimum they will take. Any offer worse than the reservation value should be rejected, because walking away is strictly better.
Reservation values usually come from an outside option: the best deal available elsewhere. If a seller can sell to a third party for 80, their reservation price is 80 and no lower offer is rational. This is the single most important number to make an LLM agent respect. A frequent failure is an agent that, eager to ‘close,’ accepts a price below its own reservation value — a deal literally worse than no deal. Pin it in the agent’s state and check every acceptance against it.
The bargaining zone (ZOPA)
Put the two reservation values on one axis and a deal becomes visible. Suppose a buyer will pay up to b and a seller will accept down to s. If s ≤ b, every price in [s, b] beats no-deal for both sides. That interval is the Zone of Possible Agreement, or ZOPA.
seller floor s = 80 buyer ceiling b = 100
ZOPA = [80, 100] width = b − s = 20
any price p in [80,100] leaves both better off than walking awayTwo consequences follow. If s > b the ZOPA is empty and no rational deal exists — a competent agent should detect this and stop. When the ZOPA is non-empty, its width is the total surplus available, and where inside it the price lands decides how that surplus splits. Negotiation is the fight over where in the ZOPA you settle.
Offer and counter-offer protocols
Agents rarely name a price and stop; they exchange offers. In the standard alternating protocol, A proposes, B accepts or counter-offers, and control passes back and forth until someone accepts or a deadline hits. The protocol turns private preferences into observable signals: each offer leaks information about the proposer’s reservation value.
Two protocol details change the whole game. A deadline forces closure — without one, two polite LLMs loop through near-identical offers forever. A discount or per-round cost makes delay expensive, pushing agents to concede sooner. First-mover advantage is real too: the opening offer anchors the range.
Multi-issue tradeoffs, logrolling, and Pareto efficiency
Real negotiations bundle several issues — price, delivery time, warranty, quantity — which the parties rarely weight equally, and that asymmetry is the source of joint value. If a buyer cares intensely about fast delivery and barely about warranty while the seller feels the reverse, each can concede the issue they value little for the one they value a lot. This trade is logrolling. Model each agent’s utility as a weighted sum over issues, u_i = Σ_k w_ik · x_k, where x_k is the settlement on issue k and w_ik is agent i’s weight on it.
A deal is Pareto-efficient if no alternative makes one agent better off without making another worse. On a single price axis every deal is trivially efficient, but with several issues agents can settle on an inefficient bundle — both accept, yet a different bundle would raise both. Strong negotiators push toward the Pareto frontier, from which no mutual improvement remains; an LLM that haggles every issue to the midpoint in isolation systematically leaves that joint value uncollected.
A worked multi-issue example
Take two issues, price and delivery speed, each scored 0 to 10. The buyer weights delivery heavily and price lightly, w_buyer = (price 0.3, delivery 0.7); the seller is the mirror, w_seller = (price 0.7, delivery 0.3).
compromise-on-both: price=5, delivery=5
u_buyer = 0.3·5 + 0.7·5 = 5.0
u_seller = 0.7·5 + 0.3·5 = 5.0
logrolled: seller gives fast delivery, buyer gives on price
price=3 (buyer concedes), delivery=9 (seller concedes)
u_buyer = 0.3·3 + 0.7·9 = 7.2
u_seller = 0.7·7 + 0.3·1 = 5.2Both agents do better under the logrolled deal — 7.2 vs 5.0 for the buyer, 5.2 vs 5.0 for the seller — because each conceded the issue it cared about least. The compromise was accepted-but-inefficient; the logrolled deal sits closer to the Pareto frontier. Discovering it requires each agent to reveal, through its offers, which issue it truly values.