DEV Community

Cover image for I thought travel agents were about recommendations until I saw people using OpenClaw to manage trip state with under 7,000 tokens per call
Lars Winstand
Lars Winstand

Posted on • Originally published at standardcompute.com

I thought travel agents were about recommendations until I saw people using OpenClaw to manage trip state with under 7,000 tokens per call

The most useful travel agent workflow I’ve seen is not “plan my vacation” in one prompt.

It’s a persistent assistant that keeps an itinerary current over days or weeks by ingesting screenshots, confirmations, and notes, then retrieving the right detail later.

That matters because retrieval-based memory can answer with under 7,000 tokens per call, while the brute-force “just resend the whole thread” approach can easily hit 25,000+.

The moment this clicked for me had nothing to do with restaurant recommendations.

It was a hotel address.

While digging through long-running agent workflows, I found a thread on r/openclaw where someone described what they actually use OpenClaw for. Not brainstorming. Not “build me a dream trip.”

Their workflow was basically:

  • create one itinerary per trip
  • upload screenshots of Airbnb, hotel, flight, and taxi bookings
  • ask follow-up questions later
  • sync the whole thing to Notion

And the questions were the boring ones that actually matter:

  • What’s my hotel address?
  • What time is my flight?
  • What’s the booking reference?
  • What’s still missing?

That’s the product.

Not trip planning.

Trip state management.

Once you see that pattern, a lot of consumer AI demos start to look backwards.

The useful part starts after the itinerary gets messy

The flashy demo is easy.

Ask GPT-5 or Claude Opus 4.6 for a 10-day Japan itinerary and you’ll get a decent answer. Coffee shops. Neighborhoods. Day trips. Maybe a few hallucinated details if you’re unlucky.

That part is fun, but it’s not the hard part.

The hard part starts later:

  • your airline changes the departure time
  • your partner forwards a PDF from the hotel
  • you screenshot an Airbnb check-in note
  • a taxi booking gets paid in one place and canceled in another
  • one reservation is under someone else’s name

Now the problem is no longer “where should I go?”

It’s:

  • Which terminal is this flight leaving from?
  • Did we already pay for the airport transfer?
  • What address do I give the driver at 11:40 PM?
  • Which night is still unbooked?

That’s where an actual agent starts beating a recommendation engine.

TripIt figured this out years ago. Wanderlog did too. Their real value is not inspiration. It’s consolidating fragmented booking data into something you can trust.

The difference with OpenClaw-style workflows is that you get a more general assistant on top of that memory.

This is really a context-window problem in disguise

A travel assistant sounds simple until the thread gets long.

You start with one screenshot.
Then a hotel confirmation.
Then a taxi receipt.
Then a late checkout note.
Then a restaurant reservation.
Then a cancellation.
Then a replacement booking.

Now your context window problem is not theoretical. It’s production.

A big context window helps, but it doesn’t solve the actual issue.

OpenClaw’s compaction docs make this pretty clear: it keeps a recent tail and summarizes older transcript content. Useful, but limited.

The best summary I saw from the OpenClaw community was:

Compaction cannot fix context that was never in the transcript.

That’s exactly right.

If the flight number never got captured cleanly, no summarization step will magically recover it.

If the hotel address was buried in a blurry screenshot and never turned into durable memory, GPT-5 and Claude Sonnet 4.6 won’t save you later.

This is why “just buy a bigger context window” is not a real architecture.

Memory discipline beats brute-force long context

This is the part I think a lot of developers still underestimate.

Modern memory layers are good enough that replaying full history every turn looks lazy.

Mem0 reports benchmark results around:

  • 92.5 on LoCoMo
  • 94.4 on LongMemEval
  • roughly 6,700 to 6,900 tokens per retrieval call

Its full-context baselines on the same tasks use 25,000+ tokens.

That’s not a small optimization.

That’s the difference between a workflow that stays cheap and one that quietly burns money every time the user asks a follow-up question.

For travel, the chat pattern is especially bad for brute-force context because the same state gets revisited over and over:

  1. parse screenshots
  2. extract structured facts
  3. update notes
  4. answer questions
  5. reconcile changes
  6. check what’s still missing

If you resend the entire trip every time, you’re paying repeatedly for stale context.

For teams building agents on n8n, Make, Zapier, OpenClaw, or custom pipelines, this is where pricing starts to matter fast.

Per-token billing punishes exactly the kind of long-running, retrieval-heavy workflow that agents are good at.

That’s also why flat-rate API access is interesting here. If you’re testing persistent agent loops, retries, memory retrieval, and lots of follow-up Q&A, you want to optimize the architecture without babysitting token spend on every run.

Standard Compute is built for that kind of workload: OpenAI-compatible API, flat monthly pricing, and routing across GPT-5.4, Claude Opus 4.6, and Grok 4.20. That’s a much better fit for agent experimentation than watching per-token costs spike every time your workflow gets chatty.

Why OpenClaw’s memory model maps well to travel

What I like about OpenClaw here is that the file-based memory model is simple enough to reason about.

You can split travel state into layers:

Layer What goes there
USER.md stable preferences like airline loyalty, seat choice, hotel style, or “avoid 6 AM flights”
MEMORY.md durable facts like confirmed hotel addresses, booking refs, paid transfers, final flight selections
memory/*.md dated notes like pending taxi confirmation, restaurant waitlist, or partial itinerary changes

That split is not cosmetic.

It’s how you stop every prompt from becoming a garbage truck full of old context.

The assistant should know where to find yesterday’s taxi note without dragging that note into every future answer.

A practical version looks like this:

trip-agent/
├── USER.md
├── MEMORY.md
└── memory/
    ├── 2025-07-01-trip-kickoff.md
    ├── 2025-07-03-flight-change.md
    └── 2025-07-05-hotel-checkin.md
Enter fullscreen mode Exit fullscreen mode

Example USER.md:

# User Preferences
- Prefer aisle seats
- Avoid departures before 8 AM when possible
- Marriott > Hilton when price is similar
- Prefer trains over short domestic flights
- Save all booking references in one place
Enter fullscreen mode Exit fullscreen mode

Example MEMORY.md:

# Durable Trip Facts
- ANA flight NH112 confirmed for Sept 14, departs 13:20 from SFO Terminal G
- Kyoto hotel: Hotel Granvia Kyoto
- Hotel address: JR Kyoto Station, Karasuma Chuo-guchi, Kyoto
- Booking reference: AG7K2P
- Airport transfer for arrival night: not booked yet
Enter fullscreen mode Exit fullscreen mode

Example dated note:

# 2025-09-10
- Airline changed departure from 12:40 to 13:20
- Spouse forwarded updated PDF confirmation
- Need to verify whether airport taxi is still needed after train option
Enter fullscreen mode Exit fullscreen mode

That structure is boring, which is exactly why it works.

The key pipeline is capture -> normalize -> retrieve

If I were building this today, I’d keep the architecture painfully simple.

Step 1: capture booking artifacts

Accept messy inputs:

  • screenshots
  • forwarded emails
  • PDFs
  • pasted text
  • chat messages

Step 2: extract structured facts

Turn raw input into fields you can trust:

{
  "type": "hotel",
  "name": "Hotel Granvia Kyoto",
  "address": "JR Kyoto Station, Karasuma Chuo-guchi, Kyoto",
  "check_in": "2025-09-14",
  "check_out": "2025-09-17",
  "booking_reference": "AG7K2P",
  "source": "screenshot"
}
Enter fullscreen mode Exit fullscreen mode

Step 3: write durable memory

Append durable facts to MEMORY.md or a structured store.

Step 4: answer via retrieval, not transcript replay

When the user asks “what’s my hotel address?”, fetch the relevant memory instead of dumping the whole trip thread back into the model.

A minimal implementation sketch

Here’s a rough CLI-style flow for an OpenAI-compatible API.

curl https://api.standardcompute.com/v1/chat/completions \
  -H "Authorization: Bearer $STANDARD_COMPUTE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4",
    "messages": [
      {"role": "system", "content": "Extract booking facts from travel confirmations into structured JSON."},
      {"role": "user", "content": "Hotel Granvia Kyoto, Sept 14 to Sept 17, booking AG7K2P, address JR Kyoto Station, Karasuma Chuo-guchi, Kyoto"}
    ]
  }'
Enter fullscreen mode Exit fullscreen mode

Then store the extracted facts somewhere retrievable.

Pseudo-code:

booking = extract_booking(raw_input)
write_durable_memory(booking)
index_for_retrieval(booking)
Enter fullscreen mode Exit fullscreen mode

Later:

question = "What's my hotel address in Kyoto?"
context = retrieve_relevant_memory(question)
answer = ask_model(question, context)
Enter fullscreen mode Exit fullscreen mode

That’s the whole pattern.

Not glamorous. Very effective.

TripIt and Wanderlog are still the right answer sometimes

To be clear: if your only requirement is “collect my reservations in one place,” TripIt and Wanderlog are already good products.

You probably should not build a custom agent just to recreate a weaker version of TripIt.

A custom agent wins when you need more than itinerary import:

  • arbitrary Q&A across screenshots, notes, and chat history
  • conflict resolution across multiple sources
  • tracking what’s still missing
  • combining reservations with user preferences
  • handling weird unstructured inputs without brittle glue code

That’s where OpenClaw-style memory starts to matter.

The boring part is the actual product

My opinionated take:

Travel recommendations are the demo.
Itinerary maintenance is the product.

“Build me a perfect 10-day Japan trip” is fun.

“Remember my ANA flight, Airbnb door code, Shinkansen booking, and Kyoto hotel address, then tell me what I still haven’t booked” is useful.

One is entertainment.

The other saves you when you’re standing outside an airport with 3% battery and no idea where the hotel confirmation email went.

That’s why travel is such a strong consumer agent workflow.

The data is fragmented.
The task unfolds over days or weeks.
The questions are concrete.
The value of a correct answer is immediate.
And the failure mode is brutally obvious when memory is sloppy.

Practical takeaways for developers

If you’re building long-running agents, this travel example generalizes well.

1. Don’t confuse generation with memory

Generating a nice itinerary is easy.
Remembering changing trip state is the hard part.

2. Bigger context windows are not a substitute for capture

If a fact never got extracted cleanly, a 200k window won’t save you.

3. Durable memory should be structured

Screenshots and PDFs are inputs, not memory.
Memory is extracted, normalized, retrievable state.

4. Retrieval is usually better than replay

If users ask repeated questions over the same corpus, retrieval beats shoving the whole transcript back into the model.

5. Cost model matters for agent design

Long-running automations get chatty. Flat-rate access changes how aggressively you can test, iterate, and deploy those workflows.

If you’re building agents that live inside n8n, Make, Zapier, OpenClaw, or your own stack, this is exactly the kind of workload where Standard Compute makes sense: same OpenAI-compatible API shape, but without per-token anxiety every time the agent has to think, retry, retrieve, or reconcile state.

If I were building this this week

I’d start with:

mkdir -p trip-agent/memory
touch trip-agent/USER.md trip-agent/MEMORY.md
Enter fullscreen mode Exit fullscreen mode

Then I’d implement three functions:

def extract_booking(raw_artifact):
    ...

def write_durable_memory(facts):
    ...

def retrieve_relevant_memory(question):
    ...
Enter fullscreen mode Exit fullscreen mode

And I would not touch fancy orchestration until those three worked reliably.

Because the trick is not orchestration.

It’s disciplined capture.

Every booking artifact should become durable facts.
Every durable fact should live somewhere retrievable.
Every retrieval should be cheaper than replaying the whole trip history.

That’s the design.

And once you see that, travel stops looking like a cute consumer AI demo and starts looking like one of the clearest proofs that persistent agents are finally becoming real.

Top comments (0)