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:
- parse screenshots
- extract structured facts
- update notes
- answer questions
- reconcile changes
- 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
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
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
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
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"
}
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"}
]
}'
Then store the extracted facts somewhere retrievable.
Pseudo-code:
booking = extract_booking(raw_input)
write_durable_memory(booking)
index_for_retrieval(booking)
Later:
question = "What's my hotel address in Kyoto?"
context = retrieve_relevant_memory(question)
answer = ask_model(question, context)
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
Then I’d implement three functions:
def extract_booking(raw_artifact):
...
def write_durable_memory(facts):
...
def retrieve_relevant_memory(question):
...
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)