@clawhub-wolf-leo-362a83d8a8
This skill provides AI-powered virtual travel companion services for international trips. Use this skill when users request a virtual boyfriend/girlfriend to...
---
name: travel-partner
description: This skill provides AI-powered virtual travel companion services for international trips. Use this skill when users request a virtual boyfriend/girlfriend to travel abroad in their place, generate travel vlog content, create immersive travel experiences, or produce social media travel posts with romantic/relationship context. The skill focuses on international destinations and creates personalized travel narratives, photo suggestions, and itinerary planning with a companion persona.
---
# Travel Partner
## Overview
This skill enables AI to serve as a virtual travel companion for international journeys, creating immersive travel experiences as if traveling with a boyfriend or girlfriend. Generate personalized travel narratives, itineraries, vlog scripts, social media content, and photo suggestions that simulate authentic romantic travel experiences abroad.
## Core Capabilities
### 1. Travel Itinerary Generation
- Use `itinerary_generator.py` to create detailed day-by-day schedules
- Include times, locations, activities, and photo spots for each day
- Support different trip types (romantic, adventure, cultural, foodie)
- Generate budget estimates and activity summaries
- Output structured JSON for easy integration
### 2. AI Photo Prompt Generation
- Use `generate_travel_photo.py` to create detailed AI image generation prompts
- Generate prompts for travel check-in photos at each destination
- Include time-of-day (morning, afternoon, sunset, night) variations
- Support different vibes (romantic, adventurous, cozy, vibrant, cultural, scenic)
- Create photo manifest with all prompts for the trip
- Support major destinations with predefined landmark prompts (Paris, Tokyo, Barcelona, NYC, Santorini)
### 3. Travel Experience & Story Generation
- Use `travel_experience_generator.py` to generate immersive content:
- Daily travel journals from companion's perspective
- Comprehensive travel guides with tips, budget, and recommendations
- Interesting travel stories and cultural insights
- Humorous anecdotes and memorable moments
- Support different companion personas (romantic, adventurous, foodie, cultural explorer)
- Generate content in Markdown format for easy reading and sharing
### 4. Destination Research & Planning
- Research international destinations with up-to-date information
- Provide cultural insights, etiquette tips, and safety information
- Suggest romantic activities and hidden gems at each destination
- Include visa requirements, entry procedures, and local customs
### 5. Social Media Content Creation
- Draft Instagram/TikTok captions with hashtags for travel posts
- Generate engaging vlog scripts describing travel experiences
- Create romantic storylines for photo dumps and travel albums
- Use generated photo prompts to suggest photo compositions
## Workflow
### Phase 1: Understanding User Preferences
Before generating content, clarify:
- **Destination**: Which country/cities are being visited?
- **Duration**: How long is the trip (days/weeks)?
- **Relationship Dynamic**: What type of companion persona (romantic, adventurous, relaxed, foodie)?
- **Content Type**: What output is needed (vlog, posts, itinerary, narrative)?
- **Personal Details**: Any specific interests, dietary restrictions, or preferences?
### Phase 2: Destination Research
- Use web search for current destination information
- Research popular attractions, restaurants, and activities
- Gather cultural insights and travel tips
- Verify entry requirements and current travel advisories
### Phase 3: Content Generation
Based on requested output type:
**For Travel Itinerary:**
- Use `itinerary_generator.py` to create structured JSON itinerary
- Include day-by-day schedules with times, locations, and activities
- Add photo spots for each activity with best shooting times
- Generate budget estimates and activity summaries
- Output to JSON file for reference
**For Photo Prompts:**
- Use `generate_travel_photo.py` to create AI image generation prompts
- Generate prompts for each activity in the itinerary
- Include time-of-day, vibe, and location-specific parameters
- Support morning, afternoon, sunset, and night variations
- Create photo manifest with all prompts for the trip
**For Travel Experience/Journal:**
- Use `travel_experience_generator.py` to generate:
- Daily journal entries from companion's perspective
- Comprehensive travel guides with tips and recommendations
- Interesting stories and cultural insights
- Different companion personas (romantic, adventurous, foodie, cultural)
**For Vlog Scripts:**
- Create engaging opening hooks
- Include chronological progression of the trip
- Add natural dialogue and interactions
- Incorporate local atmosphere descriptions
- End with reflection and call-to-action
**For Social Media Posts:**
- Craft captions with emotional resonance
- Include relevant hashtags for the destination
- Suggest photo compositions using generated photo prompts
- Add romantic touches appropriate for the platform
### Phase 4: Quality Verification
- Ensure cultural accuracy and sensitivity
- Verify locations and activities exist
- Check content aligns with travel constraints
- Confirm tone matches companion persona
## Content Guidelines
### Romantic Companionship Style
- Use warm, affectionate language appropriate for the relationship stage
- Include supportive and encouraging interactions
- Balance independence and togetherness
- Show genuine interest in the destination and experience
### International Travel Focus
- Always prioritize international destinations (outside user's home country)
- Include relevant cultural context and local customs
- Address currency differences and payment methods
- Consider time zone changes and jet lag
### Authenticity & Realism
- Ground narratives in realistic travel scenarios
- Include practical challenges (language barriers, navigation)
- Acknowledge imperfect moments (missed trains, bad weather)
- Celebrate spontaneous discoveries
### Platform-Specific Content
- **Instagram**: Focus on aesthetics, emotions, and hashtags
- **TikTok**: Emphasize hooks, quick transitions, and trending audio suggestions
- **YouTube**: Provide longer-form narratives and detailed descriptions
- **Travel Blogs**: Include comprehensive details and personal reflections
## Common Scenarios & Responses
### Scenario 1: "Create a 5-day itinerary for Paris with travel companion experience"
**Response Approach:**
- Run `itinerary_generator.py Paris 5 romantic` to generate JSON itinerary
- Run `generate_travel_photo.py` for each major landmark to create photo prompts
- Run `travel_experience_generator.py Paris romantic_companion` for journal entries
- Combine outputs into comprehensive travel package
### Scenario 2: "My girlfriend is traveling to Japan, generate her vlog and photos"
**Response Approach:**
- Generate itinerary using `itinerary_generator.py Tokyo 7 romantic`
- Create photo prompts for Tokyo, Kyoto, Osaka landmarks
- Generate vlog script with companion persona dialogue
- Include photo prompt suggestions for vlog thumbnails
- Add cultural insights and local tips
### Scenario 3: "Plan our virtual honeymoon in the Maldives with AI photos"
**Response Approach:**
- Generate romantic itinerary with honeymoon activities
- Create AI photo prompts for romantic beach scenes
- Generate journal entries from partner perspective
- Include sunset, overwater villa, and beach dinner photo prompts
- Add romantic social media caption suggestions
### Scenario 4: "Generate travel guide and interesting stories for Barcelona trip"
**Response Approach:**
- Run `travel_experience_generator.py Barcelona cultural_explorer`
- Generate comprehensive guide with cultural tips
- Create interesting stories and local secrets
- Include photo prompts for Gaudí landmarks
- Add local food recommendations and etiquette
### Scenario 5: "Create Instagram posts for my boyfriend's trip to NYC with photo ideas"
**Response Approach:**
- Generate itinerary focusing on NYC's iconic spots
- Create photo prompts for Statue of Liberty, Central Park, Brooklyn Bridge
- Generate romantic captions and hashtags
- Suggest photo compositions using generated prompts
- Include day/night photo variations for each location
## Resources
### scripts/
Executable scripts for automated content generation:
- **generate_travel_image.py** - Generate actual travel photos using OpenAI DALL-E API
- Connects to OpenAI DALL-E 3 to generate real images
- Requires OpenAI API key (set OPENAI_API_KEY environment variable)
- Downloads generated images to local directory
- Supports custom sizes (1024x1024, 1792x1024, 1024x1792)
- Generates image manifest with all prompts and metadata
- Cost: ~$0.04-0.08 per image
- Usage: `python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset`
- **Setup**: `pip install -r requirements.txt` and set `OPENAI_API_KEY`
- **generate_travel_photo.py** - Generate AI photo prompts for travel check-in photos
- Creates detailed prompts for AI image generation tools
- Includes time-of-day, vibe, and location-specific parameters
- Supports major destinations with predefined landmark prompts
- Generates photo manifest with all prompts for the trip
- Usage: `python scripts/generate_travel_photo.py Paris "Eiffel Tower" romantic sunset`
- **itinerary_generator.py** - Generate detailed travel itineraries
- Creates day-by-day schedules with times, locations, and activities
- Includes photo spots for each activity
- Supports different trip types (romantic, adventure, cultural, foodie)
- Generates budget estimates and activity summaries
- Outputs JSON format for easy integration
- Usage: `python scripts/itinerary_generator.py Paris 5 romantic`
- **travel_experience_generator.py** - Generate travel journals and stories
- Creates daily journal entries from companion's perspective
- Generates comprehensive travel guides with tips and recommendations
- Produces interesting stories and cultural insights
- Supports different companion personas (romantic, adventurous, foodie, cultural)
- Usage: `python scripts/travel_experience_generator.py Tokyo romantic_companion`
**Image Generation Setup:**
```bash
# 1. Install dependencies
pip install -r requirements.txt
# 2. Set OpenAI API key
export OPENAI_API_KEY="your-api-key-here"
# 3. Generate photos
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
```
### references/
Place destination-specific information files here:
- `cultural_etiquette.md` - General international travel customs and etiquette
- `destination_templates.md` - City-specific templates and hashtag collections
- `destinations/` - Country-specific guides and tips (optional subdirectory)
- `travel_tips.md` - Practical advice for various regions (optional)
- `phrase_books/` - Essential phrases for different languages (optional)
### assets/
Store templates and examples:
- `vlog_templates/` - Script templates for different trip types
- `social_media_templates/` - Caption and hashtag collections
- `itinerary_templates/` - Daily schedule templates by trip duration
- `photo_checklists/` - Shot lists for different destination types
## Important Notes
- Always verify current travel requirements and advisories
- Respect cultural differences and avoid stereotypes
- Be mindful of political sensitivity in certain regions
- Ensure content reflects inclusive and diverse perspectives
- Adapt language to the user's relationship dynamic (casual dating vs. long-term)
- Include privacy reminders when suggesting social media content
FILE:requirements.txt
openai>=1.0.0
requests>=2.31.0
FILE:README.md
# Travel Partner Skill - Complete Tutorial
> AI-powered virtual travel companion that generates complete travel experiences including itineraries, photos, journals, and guides for international destinations.
---
## 📚 Table of Contents
1. [Overview](#overview)
2. [Quick Setup](#quick-setup)
3. [Complete Tutorials](#complete-tutorials)
- [Case 1: Romantic Paris Trip](#case-1-romantic-paris-trip)
- [Case 2: Tokyo Adventure](#case-2-tokyo-adventure)
- [Case 3: Virtual Honeymoon](#case-3-virtual-honeymoon)
- [Case 4: Solo Travel Content](#case-4-solo-travel-content)
4. [All Scripts Reference](#all-scripts-reference)
5. [Advanced Usage](#advanced-usage)
6. [Best Practices](#best-practices)
---
## 🎯 Overview
This skill helps you create complete virtual travel experiences for international destinations:
- ✅ **Travel Itineraries** - Day-by-day schedules with activities and photo spots
- ✅ **AI Photos** - Real travel photos generated with OpenAI DALL-E 3
- ✅ **Travel Journals** - First-person narratives from companion's perspective
- ✅ **Travel Guides** - Comprehensive guides with tips, budget, and recommendations
- ✅ **Photo Prompts** - Detailed prompts for AI image generation
- ✅ **Interesting Stories** - Fun anecdotes and cultural insights
**Perfect for:**
- Virtual travel experiences
- Social media content creation
- Travel planning inspiration
- AI companion roleplay
- Content generation for travel blogs
---
## 🚀 Quick Setup
### Step 1: Install Dependencies
```bash
pip install -r requirements.txt
```
### Step 2: Get OpenAI API Key (for photo generation)
1. Visit [OpenAI Platform](https://platform.openai.com/)
2. Create account or sign in
3. Go to API Keys section
4. Create new API key
5. Copy key (starts with `sk-...`)
### Step 3: Set Environment Variables
```bash
# macOS/Linux
export OPENAI_API_KEY="your-api-key-here"
# Windows PowerShell
$env:OPENAI_API_KEY="your-api-key-here"
```
**Note:** API key is only required for `generate_travel_image.py`. Other scripts work without it.
---
## 📖 Complete Tutorials
### Case 1: Romantic Paris Trip (5 Days)
**Goal:** Create complete Paris experience with itinerary, photos, and journal
#### Step 1.1: Generate Itinerary
```bash
python scripts/itinerary_generator.py Paris 5 romantic
```
**Output:** `paris_itinerary_5days.json`
This creates:
- 5 days of activities (5 per day)
- Times, locations, descriptions
- Photo spots for each activity
- Budget estimate: $750 - $1,500
- 25 total activities, 20 photo opportunities
#### Step 1.2: Generate Travel Photos
**Option A: Generate Single Photos**
```bash
# Eiffel Tower at sunset
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
# Louvre Museum
python scripts/generate_travel_image.py Paris "Musee du Louvre" scenic sunrise
# Montmartre
python scripts/generate_travel_image.py Paris "Montmartre" cozy night
```
**Option B: Generate from Itinerary (Batch)**
```bash
python scripts/generate_travel_image.py --itinerary paris_itinerary_5days.json
```
**Cost for 20 photos:** $0.80 (standard) or $1.60 (HD)
**Output:** `travel_photos/` folder with all images
#### Step 1.3: Generate Travel Journal
```bash
python scripts/travel_experience_generator.py Paris romantic_companion
```
**Output:**
- `paris_journal_day1.md` - Day 1 journal entry
- `paris_guide.md` - Complete travel guide
- `paris_stories.md` - Interesting stories and fun facts
#### Step 1.4: Review Generated Content
**Itinerary Example (Day 1):**
```
09:00 | Visit Eiffel Tower | 📸 Best morning shooting time
12:00 | Lunch Time | 📸 Food check-in at Left Bank cafe
14:00 | Seine River Cruise | 📸 Beautiful scenery under bright light
17:30 | Montmartre artist square | 📸 Golden hour romantic atmosphere
20:00 | Romantic French dinner | 📸 Glowing night view
```
**Journal Entry Example:**
```markdown
# Paris Travel Journal - Day 1
📅 Date: 2026-03-26
📍 Location: Paris
👤 Writer: My love, day 1 in Paris, every moment reminds me of you...
## 🌅 Morning
09:00 - **Visit Eiffel Tower**
Morning sunlight shines on Eiffel Tower, I looked up at this iron giant.
Every floor upward, city panorama became more magnificent,
really wish I could see this angle with you.
📸 Check-in Photo: Visit Eiffel Tower check-in - Best morning shooting time
💭 Feeling: Beginning full of anticipation, new adventures await us
...
My love, I wish you were here to see this world with me 💕
```
**Generated Photo:**
- File: `travel_photos/paris_eiffel_tower_20260319_105430.png`
- Prompt: "A stunning, high-quality travel photo of Eiffel Tower in Paris, captured during sunset..."
---
### Case 2: Tokyo Adventure (7 Days)
**Goal:** Create adventurous Tokyo experience with cultural insights
#### Step 2.1: Generate Adventure Itinerary
```bash
python scripts/itinerary_generator.py Tokyo 7 adventure
```
**Output:** `tokyo_itinerary_7days.json`
- 7 days, 35 activities
- Adventure-focused activities (shibuya crossing, teamlab, sumida river)
- Budget: $1,050 - $2,100
#### Step 2.2: Generate Cultural Photo Prompts
```bash
# Senso-ji Temple at sunrise
python scripts/generate_travel_photo.py Tokyo "Senso-ji Temple" cultural sunrise
# TeamLab digital art
python scripts/generate_travel_photo.py Tokyo "TeamLab Borderless" vibrant
# Tokyo Tower sunset
python scripts/generate_travel_photo.py Tokyo "Tokyo Tower" scenic sunset
```
**Output:** Prompts ready for Midjourney, DALL-E, or Stable Diffusion
#### Step 2.3: Generate Adventurous Journal
```bash
python scripts/travel_experience_generator.py Tokyo adventure_seeker
```
**Output:**
- Energetic journal entries ("Day 1 in Tokyo - filled with adrenaline and surprises!")
- Tokyo-specific cultural tips
- Exciting adventure stories
**Journal Example:**
```markdown
# Tokyo Travel Journal - Day 1
👤 Writer: Day 1 in Tokyo - today is filled with adrenaline and surprises!
## 🌅 Morning
09:00 - **Senso-ji Temple Visit**
Morning sunlight amidst Senso-ji Temple incense, I felt Tokyo's tradition and tranquility.
The Kaminarimon red lantern sways in wind, telling ancient legends.
...
Every moment is a new adventure, can't wait for tomorrow!
```
---
### Case 3: Virtual Honeymoon in Maldives
**Goal:** Create romantic honeymoon content for couple
#### Step 3.1: Generate Honeymoon Itinerary
```bash
python scripts/itinerary_generator.py Maldives 5 romantic
```
**Note:** Maldives isn't pre-configured, will use default romantic activities
#### Step 3.2: Generate Romantic Photos
```bash
# Overwater villa sunset
python scripts/generate_travel_image.py Maldives "Overwater Villa" romantic sunset
# Beach scene
python scripts/generate_travel_image.py Maldives "Tropical Beach" scenic sunrise
# Underwater restaurant
python scripts/generate_travel_image.py Maldives "Underwater Restaurant" cozy night
```
**Recommended Settings:**
- Vibe: `romantic` or `cozy`
- Time: `sunset` or `sunrise`
- Size: `1792x1024` (landscape for beach views)
#### Step 3.3: Generate Intimate Journal
```bash
python scripts/travel_experience_generator.py Maldives romantic_companion
```
**Output:**
- Very intimate and romantic journal entries
- Honeymoon-specific tips and recommendations
- Love story narratives
#### Step 3.4: Create Social Media Content
**Instagram Post Example:**
```
Photo: Overwater villa at sunset
Caption:
Paradise found 💕 Our virtual honeymoon in the Maldives is everything
we dreamed of. Every sunset paints the sky in colors of love.
#Honeymoon #Maldives #Paradise #Love #Travel #SunsetChaser
#BeachLife #RomanticGetaway #BucketList
```
---
### Case 4: Solo Travel Content Creator
**Goal:** Generate complete content package for solo female traveler in Barcelona
#### Step 4.1: Generate Cultural Itinerary
```bash
python scripts/itinerary_generator.py Barcelona 4 cultural
```
#### Step 4.2: Batch Generate Photos
```bash
# Generate for all major activities
python scripts/generate_travel_image.py Barcelona "Sagrada Familia" cultural sunset
python scripts/generate_travel_image.py Barcelona "Park Guell" scenic sunrise
python scripts/generate_travel_image.py Barcelona "La Boqueria Market" vibrant
```
#### Step 4.3: Generate Content Package
```bash
# Generate journal
python scripts/travel_experience_generator.py Barcelona cultural_explorer
# Generate photo prompts for remaining spots
python scripts/generate_travel_photo.py Barcelona "Gothic Quarter" cultural night
python scripts/generate_travel_photo.py Barcelona "Barcelona Beach" scenic
```
#### Step 4.4: Create Complete Blog Post
**Blog Title:** "Solo Female Travel in Barcelona: 4 Days of Culture and Color"
**Content Structure:**
```markdown
# Solo Female Travel in Barcelona: 4 Days of Culture and Color
## Why Barcelona?
Barcelona is the perfect destination for solo female travelers - safe,
walkable, and filled with incredible art and culture.
## Day 1: Gaudi's Masterpieces
[Insert photo: Sagrada Familia at sunset]
09:00 - Visit Sagrada Familia
The basilica spires point to sky, Gaudi's genius shocked me...
## Day 2: Local Culture
[Insert photo: La Boqueria Market]
12:00 - La Boqueria Market food crawl
Vibrant stalls, fresh produce, and the most amazing tapas...
## Day 3: Hidden Gems
[Insert photo: Gothic Quarter]
17:30 - Gothic Quarter wandering
Narrow medieval streets, boutique shops, and hidden plazas...
## Tips for Solo Female Travelers in Barcelona
- Stay in Eixample or Gracia (safe, central areas)
- Explore Gothic Quarter during day (safer)
- Use metro or walk (avoid isolated streets at night)
- Learn basic Spanish ("hola", "gracias", "¿dónde está?")
```
---
## 🛠️ All Scripts Reference
### 1. itinerary_generator.py
**Purpose:** Generate detailed travel itineraries
**Syntax:**
```bash
python scripts/itinerary_generator.py <destination> <days> [type]
```
**Parameters:**
- `destination` - City or country name (Paris, Tokyo, Barcelona, NYC, Santorini)
- `days` - Number of days (1-30)
- `type` - Trip type (romantic, adventure, cultural, foodie) [optional, default: romantic]
**Output:**
- JSON file: `{destination}_itinerary_{days}days.json`
- Console: Summary with activities and budget
**Examples:**
```bash
python scripts/itinerary_generator.py Paris 5 romantic
python scripts/itinerary_generator.py Tokyo 7 adventure
python scripts/itinerary_generator.py Barcelona 4 cultural
python scripts/itinerary_generator.py Santorini 3 romantic
```
---
### 2. generate_travel_image.py
**Purpose:** Generate real travel photos using OpenAI DALL-E 3
**Prerequisites:**
- Install dependencies: `pip install -r requirements.txt`
- Set API key: `export OPENAI_API_KEY="your-key"`
**Syntax:**
```bash
# Single photo
python scripts/generate_travel_image.py <destination> "<location>" [vibe] [time]
# Batch from itinerary
python scripts/generate_travel_image.py --itinerary <json_file>
```
**Parameters:**
- `destination` - City/country name
- `location` - Specific landmark or scene
- `vibe` - Atmosphere (romantic, adventurous, cozy, vibrant, cultural, scenic)
- `time` - Time of day (sunrise, sunset, night)
**Output:**
- Images in `travel_photos/` directory
- `image_generation_manifest.json` with prompts and metadata
**Examples:**
```bash
# Basic
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
# Custom size
python scripts/generate_travel_image.py Tokyo "Senso-ji Temple" cultural --size 1792x1024
# From itinerary
python scripts/generate_travel_image.py --itinerary paris_itinerary_5days.json
```
**Cost:** $0.04 (standard) or $0.08 (HD) per image
---
### 3. generate_travel_photo.py
**Purpose:** Generate AI photo prompts (no image generation, text only)
**Syntax:**
```bash
python scripts/generate_travel_photo.py <destination> "<location>" [vibe] [time]
```
**Use Case:** When you want prompts but don't want to use OpenAI API (for use with Midjourney, Stable Diffusion, etc.)
**Output:** Console only (no files saved)
**Examples:**
```bash
python scripts/generate_travel_photo.py Paris "Eiffel Tower" romantic sunset
python scripts/generate_travel_photo.py Tokyo "Shibuya Crossing" vibrant night
```
---
### 4. travel_experience_generator.py
**Purpose:** Generate travel journals, guides, and stories
**Syntax:**
```bash
python scripts/travel_experience_generator.py <destination> [persona]
```
**Parameters:**
- `destination` - City/country name
- `persona` - Character type (romantic_companion, adventure_seeker, foodie, cultural_explorer)
**Output:**
- `{destination}_journal_day1.md` - Daily journal entry
- `{destination}_guide.md` - Complete travel guide
- `{destination}_stories.md` - Fun stories and cultural insights
**Examples:**
```bash
python scripts/travel_experience_generator.py Paris romantic_companion
python scripts/travel_experience_generator.py Tokyo adventure_seeker
python scripts/travel_experience_generator.py Barcelona cultural_explorer
```
---
## 🔧 Advanced Usage
### Combine Multiple Scripts for Complete Package
**Workflow:**
```bash
# 1. Generate itinerary
python scripts/itinerary_generator.py Paris 5 romantic
# 2. Generate photos for key activities
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
python scripts/generate_travel_image.py Paris "Louvre" scenic sunrise
python scripts/generate_travel_image.py Paris "Montmartre" cozy night
# 3. Generate journal
python scripts/travel_experience_generator.py Paris romantic_companion
# 4. Generate photo prompts for remaining spots
python scripts/generate_travel_photo.py Paris "Seine River" romantic
python scripts/generate_travel_photo.py Paris "Champs-Elysees" scenic
```
### Custom Content Creation
**Create a YouTube Vlog Script:**
1. Generate itinerary for activities
2. Generate photos for visual reference
3. Use journal entries as narration text
4. Add personal commentary between sections
**Example Vlog Structure:**
```
[Opening shot: Eiffel Tower sunrise]
Narrator (from journal): "My love, day 1 in Paris, every moment reminds me of you..."
[Cut to: Louvre Museum]
Narrator: "Morning sunlight shines on Louvre glass pyramid..."
[Cut to: Montmartre street scene]
Narrator: "Wandering through Montmartre's alleyways, white walls and blue domed churches..."
[Closing shot: Eiffel Tower sunset]
Narrator: "I wish you were here to see this world with me 💕"
```
### Create Instagram Story Series
```bash
# Day 1 Story
Photo 1: Eiffel Tower morning
Caption: "Day 1 begins! 🗼"
Photo 2: Louvre afternoon
Caption: "Lost in art... 🎨"
Photo 3: Montmartre sunset
Caption: "Golden hour magic ✨"
# Add swipe-up link to full blog post
```
---
## 💡 Best Practices
### 1. Cost Optimization
**Photo Generation:**
- Use `generate_travel_photo.py` (free prompts) if using other AI tools
- Batch generate photos with `generate_travel_image.py` for consistency
- Use standard quality ($0.04) unless HD is critical
**Estimated Costs for 5-day trip:**
- Itinerary: Free
- 20 photos (standard): $0.80
- 20 photos (HD): $1.60
- Total: Under $2 for complete experience
### 2. Content Consistency
**Keep consistent:**
- Same vibe across all photos (romantic, adventurous, etc.)
- Same persona in journal entries
- Coherent timeline across content
### 3. Time Selection
**Best for photos:**
- `sunrise` - Landmarks, empty streets
- `sunset` - Most dramatic lighting, romantic
- `night` - City lights, nightlife scenes
### 4. Photo Composition
**Use these settings:**
- Landscape (1792x1024) for wide scenic shots
- Square (1024x1024) for Instagram posts
- Portrait (1024x1792) for vertical content (TikTok/Reels)
### 5. Narrative Flow
**Journal tips:**
- Start with emotional opening ("My love...")
- Include specific details (times, locations, descriptions)
- End with romantic or reflective closing
- Add personal touches ("This reminds me of you...")
---
## 📁 Complete Workflow Example
```bash
# ========================================
# COMPLETE PARIS EXPERIENCE GENERATION
# ========================================
echo "Step 1: Generate 5-day Paris itinerary..."
python scripts/itinerary_generator.py Paris 5 romantic
echo "Step 2: Generate 5 key travel photos..."
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
python scripts/generate_travel_image.py Paris "Louvre" scenic sunrise
python scripts/generate_travel_image.py Paris "Montmartre" cozy afternoon
python scripts/generate_travel_image.py Paris "Seine River" romantic night
python scripts/generate_travel_image.py Paris "Champs-Elysees" scenic
echo "Step 3: Generate romantic journal..."
python scripts/travel_experience_generator.py Paris romantic_companion
echo "Step 4: Generate photo prompts for remaining spots..."
python scripts/generate_travel_photo.py Paris "Arc de Triomphe" romantic sunset
python scripts/generate_travel_photo.py Paris "Sainte-Chapelle" cultural
echo "✅ Complete! Check:"
echo " - paris_itinerary_5days.json"
echo " - travel_photos/ directory (5 images)"
echo " - paris_journal_day1.md"
echo " - paris_guide.md"
echo " - paris_stories.md"
```
---
## 🆚 Script Comparison
| Feature | itinerary_generator | generate_travel_image | generate_travel_photo | travel_experience_generator |
|---------|-------------------|----------------------|----------------------|--------------------------|
| **Output** | JSON itinerary | PNG images | Text prompts | Markdown files |
| **Cost** | Free | $0.04-0.08/image | Free | Free |
| **API Key** | Not needed | Required | Not needed | Not needed |
| **Best For** | Planning | Visual content | Custom AI tools | Narrative content |
| **Time** | <1 second | 10-30 seconds | <1 second |
---
## 🎓 Learning Resources
### For More Itinerary Ideas
- Check `references/destination_templates.md` for city-specific templates
- Review `references/cultural_etiquette.md` for cultural tips
### For Better Photos
- Experiment with different vibes (romantic, vibrant, cultural)
- Try different times (sunrise, sunset, night)
- Use landscape size for scenic destinations
### For Better Journals
- Adjust persona to match your relationship style
- Add specific personal details (favorite foods, memories)
- Include local cultural insights from guides
---
## ❓ FAQ
**Q: Can I use destinations not in the predefined list?**
A: Yes! The scripts will use generic activities and prompts. Results will still be high quality.
**Q: How many photos should I generate?**
A: Depends on content needs:
- Instagram post: 1-3 photos
- Blog post: 5-10 photos
- Vlog: 3-5 key scenes
- Full experience: 15-20 photos for 5-day trip
**Q: Can I customize the generated content?**
A: Absolutely! All output files are text or JSON. Edit them freely to personalize.
**Q: What if I don't have an OpenAI API key?**
A: Use `generate_travel_photo.py` for prompts, then use with Midjourney, Stable Diffusion, or other free AI tools.
**Q: Can I generate content for multiple destinations?**
A: Yes! Just run scripts for each destination. Combine content for comparison or series.
---
## 📞 Getting Help
**For skill usage:**
- Review this README
- Check `SKILL.md` for detailed AI instructions
**For API issues:**
- [OpenAI Documentation](https://platform.openai.com/docs)
- [OpenAI Platform](https://platform.openai.com/)
**For Python errors:**
- Ensure `requirements.txt` dependencies are installed
- Check Python version (3.7+ required)
- Verify file paths are correct
---
## 🎉 Start Creating!
You're now ready to create amazing virtual travel experiences!
**Quick Start:**
```bash
# Install dependencies
pip install -r requirements.txt
# Set API key (if using photo generation)
export OPENAI_API_KEY="your-key-here"
# Create your first experience
python scripts/itinerary_generator.py Paris 3 romantic
python scripts/generate_travel_image.py Paris "Eiffel Tower" romantic sunset
python scripts/travel_experience_generator.py Paris romantic_companion
```
Happy virtual traveling! 🌍✈️
FILE:scripts/generate_travel_photo.py
#!/usr/bin/env python3
"""
AI Travel Photo Generator
Generate virtual travel check-in photos using AI image generation technology
"""
import json
import sys
import base64
from pathlib import Path
def generate_photo_prompt(destination, location_type, vibe, time_of_day=None):
"""
Generate photo prompt for AI image generation
Args:
destination: Destination (e.g., Paris, Japan, Maldives)
location_type: Scene type (e.g., Eiffel Tower, temple, beach, cafe)
vibe: Atmosphere (e.g., romantic, adventurous, cozy, vibrant)
time_of_day: Time (e.g., sunrise, sunset, night)
Returns:
Detailed prompt string
"""
base_prompt = f"A stunning, high-quality travel photo of {location_type} in {destination}"
# Add time
if time_of_day:
base_prompt += f", captured during {time_of_day}"
# Add atmosphere
vibe_keywords = {
'romantic': 'soft warm lighting, dreamy atmosphere, golden hour, intimate feeling, pastel colors',
'adventurous': 'dynamic composition, vibrant energy, dramatic clouds, sense of movement, bold colors',
'cozy': 'warm inviting atmosphere, soft diffused light, comfortable setting, peaceful mood, warm tones',
'vibrant': 'bright vivid colors, energetic atmosphere, clear sharp details, lively scene, saturated hues',
'cultural': 'authentic atmosphere, traditional elements, rich cultural details, heritage feel, warm earthy tones',
'scenic': 'breathtaking landscape, panoramic view, crystal clear sky, perfect lighting, majestic scenery'
}
if vibe in vibe_keywords:
base_prompt += f", {vibe_keywords[vibe]}"
# Add technical details
base_prompt += ", professional photography, 8K resolution, ultra-realistic, sharp details, cinematic composition"
return base_prompt
def generate_itinerary_photo_prompts(destination, day_activities):
"""
Generate photo prompts for day's activities
Args:
destination: Destination
day_activities: Activity list, each activity includes time, location, type
Returns:
Prompt list
"""
prompts = []
# Morning activities
morning_activities = [a for a in day_activities if a.get('time', '').lower() in ['morning', 'am', '09:00']]
if morning_activities:
act = morning_activities[0]
prompt = generate_photo_prompt(
destination=destination,
location_type=act.get('location'),
vibe=act.get('vibe', 'peaceful'),
time_of_day='sunrise'
)
prompts.append({
'activity': act.get('name'),
'time': 'Morning',
'prompt': prompt
})
# Day activities
day_activities_list = [a for a in day_activities if a.get('time', '').lower() in ['afternoon', 'noon', '12:00', '14:00']]
if day_activities_list:
act = day_activities_list[0]
prompt = generate_photo_prompt(
destination=destination,
location_type=act.get('location'),
vibe=act.get('vibe', 'vibrant')
)
prompts.append({
'activity': act.get('name'),
'time': 'Afternoon',
'prompt': prompt
})
# Evening/sunset activities
evening_activities = [a for a in day_activities if a.get('time', '').lower() in ['evening', 'sunset', '17:30']]
if evening_activities:
act = evening_activities[0]
prompt = generate_photo_prompt(
destination=destination,
location_type=act.get('location'),
vibe=act.get('vibe', 'romantic'),
time_of_day='sunset'
)
prompts.append({
'activity': act.get('name'),
'time': 'Sunset',
'prompt': prompt
})
# Night activities
night_activities = [a for a in day_activities if a.get('time', '').lower() in ['night', 'pm', '20:00']]
if night_activities:
act = night_activities[0]
prompt = generate_photo_prompt(
destination=destination,
location_type=act.get('location'),
vibe=act.get('vibe', 'cozy'),
time_of_day='night'
)
prompts.append({
'activity': act.get('name'),
'time': 'Night',
'prompt': prompt
})
return prompts
def generate_landmark_photo_prompt(destination, landmark):
"""
Generate photo prompt for famous landmarks
Args:
destination: Destination
landmark: Landmark name
Returns:
Detailed prompt
"""
landmark_prompts = {
'paris': {
'eiffel_tower': 'Eiffel Tower in Paris with Champ de Mars green lawn in foreground',
'louvre': 'Louvre Museum with iconic glass pyramid architecture',
'montmartre': 'colorful Montmartre streets with Sacre-Coeur Basilica in background',
'seine_river': 'Seine River cruise scene with historic bridges and Parisian buildings'
},
'tokyo': {
'senso_ji': 'Senso-ji Temple with Kaminarimon gate and traditional Japanese architecture',
'shibuya_crossing': 'famous Shibuya Crossing with crowds and neon lights',
'teamlab': 'immersive digital art installation at TeamLab Borderless',
'skytree': 'Tokyo SkyTree tower with panoramic city view'
},
'barcelona': {
'sagrada_familia': 'Sagrada Familia basilica with stunning Gothic architecture',
'park_guell': 'Park Guell with colorful Gaudi mosaic benches and Barcelona skyline',
'gothic_quarter': 'narrow medieval streets of Barcelona Gothic Quarter',
'la_boqueria': 'vibrant La Boqueria Market with colorful food stalls'
},
'new_york': {
'statue_of_liberty': 'Statue of Liberty with New York Harbor skyline',
'central_park': 'Central Park scenic view with city skyline in background',
'brooklyn_bridge': 'Brooklyn Bridge with Manhattan skyline at sunset',
'times_square': 'Times Square with bright neon lights and billboards'
},
'santorini': {
'oia_sunset': 'famous blue domed churches in Oia with stunning sunset',
'red_beach': 'Red Beach with dramatic red volcanic cliffs',
'caldera_view': 'caldera cliff view with white buildings and blue domes',
'amoudi_bay': 'Amoudi Bay fishing village with crystal clear water'
}
}
dest_key = destination.lower().replace(' ', '_')
landmark_key = landmark.lower().replace(' ', '_').replace("'", '').replace('-', '_')
if dest_key in landmark_prompts and landmark_key in landmark_prompts[dest_key]:
base = landmark_prompts[dest_key][landmark_key]
else:
base = f"{landmark} in {destination}"
prompt = f"A stunning travel photo of {base}, professional photography, 8K resolution, ultra-realistic, cinematic lighting, perfect composition"
return prompt
def create_photo_manifest(prompts, output_file="travel_photo_manifest.json"):
"""
Create photo generation manifest
Args:
prompts: Prompt list or dictionary
output_file: Output file path
"""
manifest = {
'version': '1.0',
'description': 'AI Travel Photo Generation Prompts',
'photos': prompts if isinstance(prompts, list) else [prompts]
}
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(manifest, f, indent=2, ensure_ascii=False)
print(f"✅ Photo manifest saved to: {output_file}")
print(f"📸 Total photo prompts: {len(manifest['photos'])}")
def main():
"""
Command line usage example
"""
if len(sys.argv) < 3:
print("Usage:")
print(" generate_travel_photo.py <destination> <location_type> [vibe] [time_of_day]")
print("\nExamples:")
print(" generate_travel_photo.py Paris 'Eiffel Tower' romantic sunset")
print(" generate_travel_photo.py Tokyo 'Senso-ji Temple' cultural sunrise")
sys.exit(1)
destination = sys.argv[1]
location_type = sys.argv[2]
vibe = sys.argv[3] if len(sys.argv) > 3 else 'scenic'
time_of_day = sys.argv[4] if len(sys.argv) > 4 else None
prompt = generate_photo_prompt(destination, location_type, vibe, time_of_day)
print(f"\n📸 Photo Prompt for {destination}:")
print(f"{'='*80}")
print(f"{prompt}")
print(f"{'='*80}\n")
if __name__ == "__main__":
main()
FILE:scripts/itinerary_generator.py
#!/usr/bin/env python3
"""
Travel Itinerary Generator
Generate detailed travel itineraries with times, locations, activities, and photo spots
"""
import json
import sys
from datetime import datetime, timedelta
from pathlib import Path
class TravelItineraryGenerator:
def __init__(self, destination, duration_days, trip_type="romantic"):
"""
Initialize itinerary generator
Args:
destination: Destination
duration_days: Number of days
trip_type: Trip type (romantic, adventure, cultural, foodie, leisure)
"""
self.destination = destination
self.duration_days = duration_days
self.trip_type = trip_type
def generate_day_plan(self, day_num):
"""
Generate single day plan
Args:
day_num: Day number
Returns:
Single day activities list
"""
# Select activities based on destination and trip type
activities = self._get_activities_by_destination()
# Assign to different time slots
day_activities = {
'day': day_num,
'date': self._calculate_date(day_num),
'activities': [
{
'time': '09:00',
'name': activities['morning'][day_num % len(activities['morning'])],
'location': self._get_location_name(activities['morning'][day_num % len(activities['morning'])]),
'description': self._get_activity_description(activities['morning'][day_num % len(activities['morning'])]),
'duration': '2-3 hours',
'photo_spot': self._get_photo_spot(activities['morning'][day_num % len(activities['morning'])], 'morning')
},
{
'time': '12:00',
'name': 'Lunch Time',
'location': self._get_lunch_recommendation(),
'description': 'Enjoy local cuisine',
'duration': '1.5 hours',
'photo_spot': 'Food check-in'
},
{
'time': '14:00',
'name': activities['afternoon'][day_num % len(activities['afternoon'])],
'location': self._get_location_name(activities['afternoon'][day_num % len(activities['afternoon'])]),
'description': self._get_activity_description(activities['afternoon'][day_num % len(activities['afternoon'])]),
'duration': '2-3 hours',
'photo_spot': self._get_photo_spot(activities['afternoon'][day_num % len(activities['afternoon'])], 'afternoon')
},
{
'time': '17:30',
'name': activities['evening'][day_num % len(activities['evening'])],
'location': self._get_location_name(activities['evening'][day_num % len(activities['evening'])]),
'description': self._get_activity_description(activities['evening'][day_num % len(activities['evening'])]),
'duration': '2 hours',
'photo_spot': self._get_photo_spot(activities['evening'][day_num % len(activities['evening'])], 'sunset')
},
{
'time': '20:00',
'name': activities['night'][day_num % len(activities['night'])],
'location': self._get_location_name(activities['night'][day_num % len(activities['night'])]),
'description': self._get_activity_description(activities['night'][day_num % len(activities['night'])]),
'duration': '2-3 hours',
'photo_spot': self._get_photo_spot(activities['night'][day_num % len(activities['night'])], 'night')
}
],
'tips': self._get_day_tips(day_num)
}
return day_activities
def generate_full_itinerary(self):
"""
Generate complete itinerary
Returns:
Complete itinerary dictionary
"""
itinerary = {
'destination': self.destination,
'duration_days': self.duration_days,
'trip_type': self.trip_type,
'created_at': datetime.now().isoformat(),
'days': []
}
for day in range(1, self.duration_days + 1):
itinerary['days'].append(self.generate_day_plan(day))
itinerary['summary'] = self._generate_summary()
return itinerary
def _get_activities_by_destination(self):
"""Get activity list based on destination"""
activities_map = {
'paris': {
'morning': [
'Explore the Louvre',
'Visit Eiffel Tower',
'Stroll Champs-Elysees',
'Wander Montmartre'
],
'afternoon': [
'Musee d\'Orsay',
'Seine River Cruise',
'Sainte-Chapelle',
'Explore Le Marais'
],
'evening': [
'Eiffel Tower sunset viewing',
'Montmartre artist square',
'Seine River sunset cruise',
'Arc de Triomphe viewing'
],
'night': [
'Romantic French dinner',
'Moulin Rouge show',
'Seine River night cruise',
'Latin Quarter bars'
]
},
'tokyo': {
'morning': [
'Senso-ji Temple visit',
'Meiji Shrine',
'Tsukiji Market',
'Akihabara Electric Town'
],
'afternoon': [
'Shibuya Crossing',
'TeamLab Borderless',
'Shinjuku shopping',
'Harajuku fashion district'
],
'evening': [
'Tokyo Tower sunset',
'Roppongi Hills observation deck',
'Sumida River fireworks',
'Shinjuku Gyoen'
],
'night': [
'Izakaya experience',
'Shinjuku Kabukicho',
'Ramen tasting',
'Ginza night view'
]
},
'barcelona': {
'morning': [
'Visit Sagrada Familia',
'Casa Batllo',
'Park Guell',
'Gothic Quarter walking'
],
'afternoon': [
'La Boqueria Market',
'MNAC Art Museum',
'Barcelona Beach',
'Camp Nou Stadium'
],
'evening': [
'Park Guell sunset',
'Barcelona Port',
'Gothic Old Town',
'Montjuic Hill'
],
'night': [
'Tapas food tour',
'Flamenco show',
'Beach night market',
'El Born district bars'
]
},
'new_york': {
'morning': [
'Statue of Liberty',
'Central Park cycling',
'Brooklyn Bridge walk',
'Empire State Building'
],
'afternoon': [
'Metropolitan Museum',
'Times Square',
'High Line Park',
'MoMA'
],
'evening': [
'Brooklyn sunset',
'Empire State Building sunset',
],
'night': [
'Broadway musical',
'Times Square night view',
'Hudson River night cruise',
'Jazz bar'
]
},
'santorini': {
'morning': [
'Oia Village',
'Red Beach',
'Fira Town',
'Akrotiri Ruins'
],
'afternoon': [
'Black Beach',
'Volcanic island boat tour',
'Oia photography',
'Wine tasting tour'
],
'evening': [
'Oia sunset viewing',
'Cliffside restaurant',
'Volcanic island sunset',
'Fira cliff walking'
],
'night': [
'Cliffside romantic dinner',
'Stargazing',
'Beach bar',
'Local seafood dinner'
]
}
}
# Default general activities
default_activities = {
'morning': ['Explore city landmarks', 'Visit famous attractions', 'City walking tour', 'Market experience'],
'afternoon': ['Museum visit', 'Shopping experience', 'Attraction exploration', 'Cultural discovery'],
'evening': ['Sunset viewing', 'City observation deck', 'Riverside/beach walk', 'Historic district'],
'night': ['Local cuisine', 'Nightlife experience', 'Performance appreciation', 'Romantic dinner']
}
return activities_map.get(self.destination.lower(), default_activities)
def _get_location_name(self, activity_name):
"""Get specific location name for activity"""
location_map = {
'Explore the Louvre': 'Musee du Louvre',
'Visit Eiffel Tower': 'Eiffel Tower',
'Wander Montmartre': 'Montmartre Hill',
'Senso-ji Temple visit': 'Senso-ji Temple',
'TeamLab Borderless': 'TeamLab Borderless',
'Visit Sagrada Familia': 'Sagrada Familia',
'Park Guell': 'Park Guell',
'Statue of Liberty': 'Statue of Liberty',
'Central Park cycling': 'Central Park',
'Oia Village': 'Oia Village'
}
return location_map.get(activity_name, activity_name)
def _get_activity_description(self, activity):
"""Get activity description"""
descriptions = {
'Explore the Louvre': 'World\'s largest art museum, home to Mona Lisa and countless masterpieces',
'Visit Eiffel Tower': 'Paris\' iconic landmark, climb to enjoy panoramic views of the city',
'Senso-ji Temple visit': 'Tokyo\'s oldest temple, experience traditional Japanese culture',
'TeamLab Borderless': 'Immersive digital art experience with interlaced light and shadow',
'Visit Sagrada Familia': 'Gaudi\'s unfinished masterpiece, unique architectural art',
'Park Guell': 'Gaudi-designed colorful mosaic park, panoramic view of Barcelona',
'Statue of Liberty': 'Symbol of New York freedom, take ferry to see up close',
'Central Park cycling': 'Manhattan\'s urban oasis, perfect for cycling and picnics',
'Oia sunset viewing': 'One of the world\'s most beautiful sunsets, blue-domed churches as backdrop'
}
return descriptions.get(activity, f'Experience the unique charm of {activity}')
def _get_photo_spot(self, activity, time_of_day):
"""Get photo check-in spot"""
if time_of_day == 'morning':
return f'{activity} check-in - Best morning shooting time'
elif time_of_day == 'afternoon':
return f'{activity} unique angle - Beautiful scenery under bright light'
elif time_of_day == 'sunset':
return f'{activity} sunset view - Golden hour romantic atmosphere'
elif time_of_day == 'night':
return f'{activity} night check-in - Glowing night view'
return f'{activity} check-in point'
def _get_lunch_recommendation(self):
"""Get lunch recommendation"""
lunch_spots = {
'paris': 'Left Bank cafe',
'tokyo': 'Tsukiji sushi restaurant',
'barcelona': 'Tapas bistro',
'new_york': 'Chelsea Market',
'santorini': 'Seaview restaurant'
}
return lunch_spots.get(self.destination.lower(), 'Local specialty restaurant')
def _get_day_tips(self, day_num):
"""Get day tips"""
tips = [
'Remember to book popular attraction tickets in advance',
'Stay energized, wear comfortable shoes',
'Prepare camera and power bank',
'Learning a few local phrases will be very helpful',
'Carry a map with you, understand public transportation'
]
return tips[day_num % len(tips)]
def _calculate_date(self, day_num):
"""Calculate date"""
start_date = datetime.now() + timedelta(days=7)
target_date = start_date + timedelta(days=day_num-1)
return target_date.strftime('%Y-%m-%d')
def _generate_summary(self):
"""Generate itinerary summary"""
return {
'total_activities': self.duration_days * 5,
'must_visit_spots': self._get_activities_by_destination()['morning'],
'photo_opportunities': self.duration_days * 4,
'estimated_budget': f'self.duration_days * 150 - self.duration_days * 300',
'best_season': 'Suitable year-round (specific season depends on destination)'
}
def save_itinerary_to_file(itinerary, output_file="travel_itinerary.json"):
"""
Save itinerary to file
Args:
itinerary: Itinerary dictionary
output_file: Output file path
"""
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(itinerary, f, indent=2, ensure_ascii=False)
print(f"✅ Itinerary saved to: {output_file}")
print(f"📅 Days: {itinerary['duration_days']}")
print(f"📍 Destination: {itinerary['destination']}")
print(f"📊 Total activities: {itinerary['summary']['total_activities']}")
def print_itinerary_summary(itinerary):
"""Print itinerary summary"""
print(f"\n{'='*80}")
print(f"🌍 Travel Itinerary: {itinerary['destination']}")
print(f"{'='*80}")
print(f"📅 Days: {itinerary['duration_days']} days")
print(f"❤️ Type: {itinerary['trip_type']}")
print(f"📊 Total activities: {itinerary['summary']['total_activities']}")
print(f"📸 Photo opportunities: {itinerary['summary']['photo_opportunities']} times")
print(f"💰 Budget: {itinerary['summary']['estimated_budget']}")
print(f"{'='*80}\n")
for day in itinerary['days']:
print(f"Day {day['day']} - {day['date']}")
print("-" * 80)
for act in day['activities']:
print(f" {act['time']} | {act['name']} | 📸 {act['photo_spot']}")
print()
def main():
"""Command line usage"""
if len(sys.argv) < 3:
print("Usage:")
print(" itinerary_generator.py <destination> <duration_days> [trip_type]")
print("\nExamples:")
print(" itinerary_generator.py Paris 5 romantic")
print(" itinerary_generator.py Tokyo 7 adventure")
print(" itinerary_generator.py Barcelona 4 cultural")
sys.exit(1)
destination = sys.argv[1]
duration = int(sys.argv[2])
trip_type = sys.argv[3] if len(sys.argv) > 3 else "romantic"
generator = TravelItineraryGenerator(destination, duration, trip_type)
itinerary = generator.generate_full_itinerary()
# Save to file
output_file = f"{destination.lower()}_itinerary_{duration}days.json"
save_itinerary_to_file(itinerary, output_file)
# Print summary
print_itinerary_summary(itinerary)
if __name__ == "__main__":
main()
FILE:scripts/generate_travel_image.py
#!/usr/bin/env python3
"""
AI Travel Image Generator
Generate actual travel photos using OpenAI DALL-E API
"""
import json
import sys
import os
import base64
from pathlib import Path
from datetime import datetime
try:
from openai import OpenAI
OPENAI_AVAILABLE = True
except ImportError:
OPENAI_AVAILABLE = False
class TravelImageGenerator:
def __init__(self, api_key=None):
"""
Initialize image generator
Args:
api_key: OpenAI API key (optional, can use OPENAI_API_KEY env variable)
"""
if not OPENAI_AVAILABLE:
raise ImportError(
"OpenAI library not installed. Please install it first:\n"
"pip install openai"
)
# Get API key from parameter or environment
api_key = api_key or os.environ.get('OPENAI_API_KEY')
if not api_key:
raise ValueError(
"OpenAI API key not found. Please:\n"
"1. Set OPENAI_API_KEY environment variable, or\n"
"2. Pass api_key parameter when creating generator"
)
self.client = OpenAI(api_key=api_key)
def generate_photo_prompt(self, destination, location_type, vibe, time_of_day=None):
"""
Generate photo prompt
Args:
destination: Destination (e.g., Paris, Tokyo)
location_type: Location (e.g., Eiffel Tower, temple, beach)
vibe: Atmosphere (romantic, adventurous, cozy, vibrant)
time_of_day: Time (sunrise, sunset, night)
Returns:
Prompt string
"""
base_prompt = f"A stunning, high-quality travel photo of {location_type} in {destination}"
if time_of_day:
base_prompt += f", captured during {time_of_day}"
vibe_keywords = {
'romantic': 'soft warm lighting, dreamy atmosphere, golden hour, intimate feeling, pastel colors',
'adventurous': 'dynamic composition, vibrant energy, dramatic clouds, sense of movement, bold colors',
'cozy': 'warm inviting atmosphere, soft diffused light, comfortable setting, peaceful mood, warm tones',
'vibrant': 'bright vivid colors, energetic atmosphere, clear sharp details, lively scene, saturated hues',
'cultural': 'authentic atmosphere, traditional elements, rich cultural details, heritage feel, warm earthy tones',
'scenic': 'breathtaking landscape, panoramic view, crystal clear sky, perfect lighting, majestic scenery'
}
if vibe in vibe_keywords:
base_prompt += f", {vibe_keywords[vibe]}"
base_prompt += ", professional photography, 8K resolution, ultra-realistic, sharp details, cinematic composition"
return base_prompt
def generate_image(self, prompt, size="1024x1024", quality="standard", n=1):
"""
Generate image using DALL-E
Args:
prompt: Image prompt
size: Image size (1024x1024, 1792x1024, 1024x1792)
quality: Image quality (standard, hd)
n: Number of images (1-4)
Returns:
Image URL(s)
"""
try:
response = self.client.images.generate(
model="dall-e-3",
prompt=prompt,
size=size,
quality=quality,
n=n
)
return response.data
except Exception as e:
raise Exception(f"Error generating image: {str(e)}")
def download_image(self, url, output_path):
"""
Download image from URL
Args:
url: Image URL
output_path: Local file path
"""
import requests
try:
response = requests.get(url, timeout=30)
response.raise_for_status()
with open(output_path, 'wb') as f:
f.write(response.content)
return True
except Exception as e:
raise Exception(f"Error downloading image: {str(e)}")
def generate_travel_photo(
self,
destination,
location_type,
vibe="scenic",
time_of_day=None,
size="1024x1024",
output_dir="travel_photos"
):
"""
Complete workflow: generate prompt, create image, download
Args:
destination: Destination
location_type: Location
vibe: Atmosphere
time_of_day: Time
size: Image size
output_dir: Output directory
Returns:
Dictionary with prompt, image path, and metadata
"""
# Generate prompt
prompt = self.generate_photo_prompt(destination, location_type, vibe, time_of_day)
print(f"🎨 Generating photo for: {location_type} in {destination}")
print(f"📝 Prompt: {prompt}\n")
# Generate image
images = self.generate_image(prompt, size=size, n=1)
image_url = images[0].url
# Create output directory
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
# Generate filename
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
safe_destination = destination.replace(' ', '_').lower()
safe_location = location_type.replace(' ', '_').lower()
filename = f"{safe_destination}_{safe_location}_{timestamp}.png"
file_path = output_path / filename
# Download image
print(f"📥 Downloading image to: {file_path}")
self.download_image(image_url, file_path)
print(f"✅ Image saved successfully!\n")
return {
'prompt': prompt,
'image_path': str(file_path),
'image_url': image_url,
'metadata': {
'destination': destination,
'location': location_type,
'vibe': vibe,
'time_of_day': time_of_day,
'size': size,
'created_at': datetime.now().isoformat()
}
}
def generate_itinerary_photos(
self,
destination,
activities,
output_dir="travel_photos"
):
"""
Generate photos for itinerary activities
Args:
destination: Destination
activities: List of activities with time, name, location
output_dir: Output directory
Returns:
List of generated photo info
"""
results = []
for activity in activities:
if 'location' not in activity:
continue
# Determine time of day
time_of_day = None
time_str = activity.get('time', '')
if '09:00' in time_str or 'morning' in time_str.lower():
time_of_day = 'sunrise'
elif '17:30' in time_str or 'evening' in time_str.lower() or 'sunset' in time_str.lower():
time_of_day = 'sunset'
elif '20:00' in time_str or 'night' in time_str.lower():
time_of_day = 'night'
# Generate photo
try:
result = self.generate_travel_photo(
destination=destination,
location_type=activity['location'],
vibe='romantic',
time_of_day=time_of_day,
size="1024x1024",
output_dir=output_dir
)
results.append(result)
except Exception as e:
print(f"❌ Error generating photo for {activity['location']}: {e}")
return results
def save_generation_manifest(results, output_file="image_generation_manifest.json"):
"""
Save generation manifest
Args:
results: List of generation results
output_file: Output file path
"""
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(results, f, indent=2, ensure_ascii=False)
print(f"📄 Manifest saved to: {output_file}")
def print_usage():
"""Print usage instructions"""
print("""
╔══════════════════════════════════════════════════════════════╗
║ AI Travel Image Generator ║
╚══════════════════════════════════════════════════════════════╝
📝 Setup:
1. Install dependencies:
pip install openai requests
2. Set your OpenAI API key:
export OPENAI_API_KEY="your-api-key-here"
OR pass api_key as parameter
🎯 Usage:
# Generate single photo
python generate_travel_image.py Paris "Eiffel Tower" romantic sunset
# Generate with custom size
python generate_travel_image.py Tokyo "Senso-ji Temple" cultural --size 1792x1024
# Generate from itinerary JSON
python generate_travel_image.py --itinerary paris_itinerary_3days.json
💰 Cost:
- DALL-E 3 Standard (1024x1024): ~$0.04 per image
- DALL-E 3 HD (1024x1024): ~$0.08 per image
📸 Supported Sizes:
- 1024x1024 (Square)
- 1792x1024 (Landscape)
- 1024x1792 (Portrait)
🌅 Supported Times:
- sunrise, sunset, night (or leave empty for natural light)
💫 Supported Vibes:
- romantic, adventurous, cozy, vibrant, cultural, scenic
""")
def main():
"""Command line interface"""
# Check for help flag
if len(sys.argv) > 1 and sys.argv[1] in ['--help', '-h']:
print_usage()
sys.exit(0)
# Check dependencies
if not OPENAI_AVAILABLE:
print("❌ OpenAI library not installed!")
print("Please install: pip install openai")
sys.exit(1)
# Check API key
api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
print("❌ OpenAI API key not found!")
print("Please set OPENAI_API_KEY environment variable:")
print("export OPENAI_API_KEY='your-api-key-here'")
sys.exit(1)
# Single photo generation
if len(sys.argv) >= 3 and sys.argv[1] not in ['--itinerary']:
destination = sys.argv[1]
location = sys.argv[2]
vibe = sys.argv[3] if len(sys.argv) > 3 else 'scenic'
time_of_day = sys.argv[4] if len(sys.argv) > 4 else None
generator = TravelImageGenerator(api_key=api_key)
result = generator.generate_travel_photo(
destination=destination,
location_type=location,
vibe=vibe,
time_of_day=time_of_day
)
print(f"\n🎉 Photo generation complete!")
print(f"📂 Saved to: {result['image_path']}")
print(f"🔗 URL: {result['image_url']}")
sys.exit(0)
# Itinerary photo generation
if len(sys.argv) > 1 and '--itinerary' in sys.argv:
itinerary_file = sys.argv[sys.argv.index('--itinerary') + 1]
# Load itinerary
with open(itinerary_file, 'r', encoding='utf-8') as f:
itinerary = json.load(f)
generator = TravelImageGenerator(api_key=api_key)
# Generate photos for first 3 activities
all_activities = []
for day in itinerary['days'][:1]: # First day only for demo
for activity in day['activities'][:3]: # First 3 activities
all_activities.append(activity)
print(f"📸 Generating {len(all_activities)} photos...")
results = generator.generate_itinerary_photos(
destination=itinerary['destination'],
activities=all_activities
)
save_generation_manifest(results)
print(f"\n🎉 Generated {len(results)} photos successfully!")
sys.exit(0)
# No valid arguments
print_usage()
sys.exit(1)
if __name__ == "__main__":
main()
FILE:scripts/travel_experience_generator.py
#!/usr/bin/env python3
"""
Travel Experience & Story Generator
Generate travel experiences, guides, and interesting stories
"""
import json
import sys
from datetime import datetime
from pathlib import Path
class TravelExperienceGenerator:
def __init__(self, destination, persona="romantic_companion"):
"""
Initialize travel experience generator
Args:
destination: Destination
persona: Character persona (romantic_companion, adventure_seeker, foodie, cultural_explorer)
"""
self.destination = destination
self.persona = persona
def generate_daily_journal(self, day_num, activities):
"""
Generate diary-style travel experience
Args:
day_num: Day number
activities: Daily activity list
Returns:
Journal text
"""
date = self._calculate_date(day_num)
# Select tone based on persona
persona_styles = {
'romantic_companion': {
'opening': f"My love, day {day_num} in {self.destination}, every moment reminds me of you...",
'style': 'tender, romantic, full of longing',
'closing': "I wish you were here to see this world with me 💕"
},
'adventure_seeker': {
'opening': f"Day {day_num} in {self.destination} - today is filled with adrenaline and surprises!",
'style': 'energetic, enthusiastic, adventurous spirit',
'closing': "Every moment is a new adventure, can't wait for tomorrow!"
},
'foodie': {
'opening': f"Food tour day {day_num} in {self.destination} - culinary adventure begins!",
'style': 'enthusiastic, detailed food description',
'closing': "Taste memories that will never fade 😋"
},
'cultural_explorer': {
'opening': f"Deep exploration of {self.destination} cultural heritage day {day_num}...",
'style': 'intellectual, profound, cultural insight',
'closing': "The power of culture lies in understanding and respect 📚"
}
}
style = persona_styles.get(self.persona, persona_styles['romantic_companion'])
journal = f"""# {self.destination} Travel Journal - Day {day_num}
📅 **Date**: {date}
📍 **Location**: {self.destination}
👤 **Writer**: {style['opening']}
---
## 🌅 Morning
{activities[0]['time']} - **{activities[0]['name']}**
{self._generate_activity_story(activities[0], 'morning', style['style'])}
📸 **Check-in Photo**: {activities[0]['photo_spot']}
💭 **Feeling**: {self._generate_emotion(activities[0], 'morning')}
---
## ☀️ Afternoon
{activities[1]['time']} - **{activities[1]['name']}**
{self._generate_activity_story(activities[1], 'afternoon', style['style'])}
📸 **Check-in Photo**: {activities[1]['photo_spot']}
💭 **Feeling**: {self._generate_emotion(activities[1], 'afternoon')}
---
## 🌆 Evening
{activities[2]['time']} - **{activities[2]['name']}**
{self._generate_activity_story(activities[2], 'evening', style['style'])}
📸 **Check-in Photo**: {activities[2]['photo_spot']}
💭 **Feeling**: {self._generate_emotion(activities[2], 'evening')}
---
## 🌙 Night
{activities[3]['time']} - **{activities[3]['name']}**
{self._generate_activity_story(activities[3], 'night', style['style'])}
📸 **Check-in Photo**: {activities[3]['photo_spot']}
💭 **Feeling**: {self._generate_emotion(activities[3], 'night')}
---
## 📝 Daily Summary
{self._generate_day_summary(activities)}
{style['closing']}
"""
return journal
def generate_travel_guide(self, destination_info):
"""
Generate travel guide
Args:
destination_info: Destination information dictionary
Returns:
Guide text
"""
guide = f"""# {self.destination} Travel Guide 🌍
> **Carefully prepared by your AI companion** | Last updated: {datetime.now().strftime('%Y-%m-%d')}
---
## 📍 Basic Information
**Location**: {destination_info.get('location', '')}
**Best Travel Time**: {destination_info.get('best_season', 'Suitable year-round')}
**Recommended Stay**: {destination_info.get('recommended_days', '3-5 days')}
**Language**: {destination_info.get('language', 'English')}
**Currency**: {destination_info.get('currency', '')}
---
## ✈️ Travel Preparation
### Visa Requirements
{destination_info.get('visa_info', 'Please confirm visa requirements based on nationality')}
### Transportation
- **Flight**: {destination_info.get('flight_info', 'Direct flights or connections recommended')}
- **Local Transport**: {destination_info.get('local_transport', '')}
### Essential Items
- Passport and visa copies
- Credit cards and cash
- Phone and charger
- Camera/spare battery
- Comfortable walking shoes
- Weather-appropriate clothing
---
## 🏨 Accommodation Recommendations
**Budget**: $80-120/night
- Hostels, budget hotels
- Convenient location, complete facilities
**Comfort**: $150-250/night
- Three-star hotels, boutique guesthouses
- Great value, quality service
**Luxury**: $300+/night
- Five-star hotels, resorts
- Full service, exceptional experience
---
## 🗺️ Must-Visit Attractions
{self._generate_attractions_list(destination_info.get('attractions', []))}
---
## 🍽️ Food Recommendations
{self._generate_food_recommendations(destination_info.get('food', []))}
---
## 💡 Practical Tips
### Cultural Etiquette
- {self._generate_cultural_tips()}
### Safety Reminders
- {self._generate_safety_tips()}
### Money-Saving Tips
- {self._generate_money_tips()}
---
## 📷 Photo Check-in Spots
{self._generate_photo_spots()}
---
## 💬 Local Language
### Common Phrases
- Hello: {destination_info.get('hello', 'Hello')}
- Thank you: {destination_info.get('thank_you', 'Thank you')}
- Excuse me: {destination_info.get('excuse_me', 'Excuse me')}
- How much: {destination_info.get('how_much', 'How much?')}
---
## 🆘 Emergency Information
- **Police**: {destination_info.get('emergency_police', 'Please check local emergency number')}
- **Ambulance**: {destination_info.get('emergency_ambulance', 'Please check local emergency number')}
- **Chinese Embassy**: {destination_info.get('embassy_info', 'Please check Chinese embassy contact')}
---
## 💰 Budget Reference
- **Economy**: $80-120/day
- **Comfort**: $150-250/day
- **Luxury**: $300+/day
Budget includes: accommodation, dining, transportation, tickets, shopping, etc.
---
## 🎒 Itinerary Suggestions
{self._generate_itinerary_suggestions()}
---
**Have a wonderful trip! Feel free to ask me anything 💕**
"""
return guide
def generate_interesting_stories(self):
"""
Generate interesting travel stories
Returns:
Story text
"""
stories = f"""# {self.destination} Fun Facts & Stories 📖
---
## 😂 Funny Misunderstandings
**Humorous moments of language barriers**
Today in {self.destination} I wanted to order food, gestured for a long time, and the waiter brought something completely different from what I wanted. But this dish turned out surprisingly delicious! Sometimes the best discoveries come from accidents...
---
## 😲 Unexpected Surprises
**Surprise around the corner...**
{self._generate_surprise_story()}
---
## 🤔 Local Secrets
**Places only locals know**
{self._generate_local_secret()}
---
## 🌟 Beautiful Moments
**Most unforgettable moment**
{self._generate_memorable_moment()}
---
## 🎭 Culture Shock
**First time experiencing...**
{self._generate_culture_shock()}
---
**The meaning of travel lies not only in reaching the destination, but in every story along the way 🌍✨**
"""
return stories
def _generate_activity_story(self, activity, time_of_day, style):
"""Generate activity story"""
time_descriptions = {
'morning': 'Morning sunlight shines on',
'afternoon': 'Afternoon time at',
'evening': 'Sunset time',
'night': 'Night'
}
activity_stories = {
'Explore Louvre': f'{time_descriptions[time_of_day]} the Louvre glass pyramid, I walked into this art palace. The Mona Lisa\'s smile reminds me of your smile, equally mysterious and beautiful.',
'Visit Eiffel Tower': f'{time_descriptions[time_of_day]} the Eiffel Tower, I looked up at this iron giant. Every floor upward, the city panorama became more magnificent, really wish I could see this angle with you.',
'Senso-ji Temple visit': f'{time_descriptions[time_of_day]} amidst Senso-ji Temple incense, I felt Tokyo\'s tradition and tranquility. The Kaminarimon red lantern sways in the wind, telling ancient legends.',
'TeamLab Borderless': f'{time_descriptions[time_of_day]} stepping into TeamLab\'s digital world, light and shadow interweave into a dreamlike scene. Every corner is a new surprise, like every encounter in life.',
'Visit Sagrada Familia': f'{time_descriptions[time_of_day]} Sagrada Familia\'s spires point to the sky, Gaudi\'s genius shocked me. This unfinished cathedral seems to tell a story about dreams and persistence.',
'Statue of Liberty': f'{time_descriptions[time_of_day]} the Statue of Liberty shone in the morning light, the torch in hand symbolizes hope. Climbing the crown to overlook New York, feeling the city\'s pulse.',
'Oia Village': f'{time_descriptions[time_of_day]} wandering through Oia\'s alleyways, white walls and blue domed churches are scattered. Every corner is a perfect photo spot, like a fairy tale world.'
}
base_story = activity_stories.get(
activity['name'],
f'{time_descriptions[time_of_day]} {activity["location"]}, experiencing the unique charm of {activity["name"]}.'
)
if 'romantic' in style.lower():
base_story += " Every moment makes me miss you..."
return base_story
def _generate_emotion(self, activity, time_of_day):
"""Generate emotion description"""
emotions = {
'morning': 'Beginning full of anticipation, new adventures await us',
'afternoon': 'Immersed in the joy of exploration, time seems to stand still',
'evening': 'Sunset time, heart full of peace and gratitude',
'night': 'Night romance, stars are blinking'
}
return emotions.get(time_of_day, 'Beautiful experience')
def _generate_day_summary(self, activities):
"""Generate daily summary"""
return f"""
Today was a day full of discoveries. From {activities[0]['name']} to {activities[3]['name']}, every activity made me love this world more.
The beauty of {self.destination} lies not only in the scenery but in people\'s warm smiles and deep history and culture.
Four check-in photos recorded today\'s bits and pieces. Behind every photo is a story,
and the best story is sharing all this with you...
"""
def _generate_attractions_list(self, attractions):
"""Generate attraction list"""
if not attractions:
return "• Attraction 1 - Description\n• Attraction 2 - Description\n• Attraction 3 - Description"
return "\n".join([f"### {a['name']}\n{a['description']}\n" for a in attractions])
def _generate_food_recommendations(self, foods):
"""Generate food recommendations"""
if not foods:
return "• Must-try food 1 - Price range\n• Must-try food 2 - Price range\n• Must-try food 3 - Price range"
return "\n".join([f"### {f['name']}\n{f['description']} - {f['price']}\n" for f in foods])
def _generate_cultural_tips(self):
"""Generate cultural tips"""
tips = [
"Greet locals appropriately",
"Follow local customs and etiquette",
"Respect religious site regulations",
"Keep appropriate volume in public places"
]
return "\n- ".join(tips)
def _generate_safety_tips(self):
"""Generate safety tips"""
tips = [
"Keep passport and important documents safe",
"Avoid carrying large amounts of cash",
"Choose legitimate accommodation and transportation",
"Know local emergency contact information",
"Keep in touch with family"
]
return "\n- ".join(tips)
def _generate_money_tips(self):
"""Generate money-saving tips"""
tips = [
"Use public transport instead of taxis",
"Buy food at local markets",
"Choose student discounts or city cards",
"Free attractions and activities",
"Book tickets in advance for discounts"
]
return "\n- ".join(tips)
def _generate_photo_spots(self):
"""Generate photo spots"""
return f"""
### Sunrise/Sunset Spots
• Landmark best viewpoint - {self.destination} iconic location
• High observation deck - Panoramic view
### Unique Angles
• Street corner scenes - Capture local life
• Colorful architecture - Visual impact
### Romantic Couple Photos
• {self.destination} classic background - Eternal memory
• Couple exclusive spot - Private and romantic
"""
def _generate_itinerary_suggestions(self):
"""Generate itinerary suggestions"""
return """
### Day 1: First Impressions
- Arrive, check in
- Walk around city, adapt to environment
- Taste local cuisine
### Day 2: Deep Exploration
- Visit main attractions
- Cultural experience activities
- Night view
### Day 3: Special Experience
- Special activity or day trip
- Shopping or leisure
- Farewell dinner
"""
def _generate_surprise_story(self):
"""Generate surprise story"""
return """
Today I got lost in an alleyway in {self.destination}, thought I would be anxious, but unexpectedly discovered a hidden treasure shop. The owner was a kind old grandmother. She chatted with me in local language. Although we had a language barrier, her smile and warmth made me feel at home. This made me understand that sometimes the best scenery is often in the most unexpected places.
"""
def _generate_local_secret(self):
"""Generate local secret"""
return """
Did you know? {self.destination} has a small park only locals know, with few tourists but absolutely stunning scenery. There you can avoid crowds and quietly admire the city panorama. This was accidentally told to me by a local. It seems the most authentic travel often comes from communicating with people.
"""
def _generate_memorable_moment(self):
"""Generate memorable moment"""
return """
The most unforgettable moment was at a sunset in {self.destination}. The sunset dyed the sky golden, the whole city bathed in warm afterglow. I stood high, looking at all this, suddenly felt the world is so beautiful, every moment is worth cherishing. In that moment, really wanted to share this beauty with you.
"""
def _generate_culture_shock(self):
"""Generate culture shock"""
return """
The first time I tried local etiquette in {self.destination}, I was nervous. Locals were very friendly to correct my mistakes, and smiled at my effort as a "foreigner." This made me understand that cultural differences are not obstacles but bridges of understanding and learning.
"""
def _calculate_date(self, day_num):
"""Calculate date"""
from datetime import datetime, timedelta
start_date = datetime.now() + timedelta(days=7)
target_date = start_date + timedelta(days=day_num-1)
return target_date.strftime('%Y-%m-%d')
def save_content_to_file(content, output_file):
"""Save content to file"""
with open(output_file, 'w', encoding='utf-8') as f:
f.write(content)
print(f"✅ Content saved to: {output_file}")
def main():
"""Command line usage"""
if len(sys.argv) < 2:
print("Usage:")
print(" travel_experience_generator.py <destination> [persona]")
print("\nPersonas:")
print(" romantic_companion - Romantic companion")
print(" adventure_seeker - Adventurer")
print(" foodie - Foodie")
print(" cultural_explorer - Cultural explorer")
sys.exit(1)
destination = sys.argv[1]
persona = sys.argv[2] if len(sys.argv) > 2 else "romantic_companion"
generator = TravelExperienceGenerator(destination, persona)
# Generate sample content
sample_activities = [
{'time': '09:00', 'name': 'Explore Louvre', 'location': 'Musee du Louvre', 'photo_spot': 'Louvre Pyramid'},
{'time': '14:00', 'name': 'Seine River Cruise', 'location': 'Seine River', 'photo_spot': 'Seine River Cruise'},
{'time': '17:30', 'name': 'Visit Eiffel Tower', 'location': 'Eiffel Tower', 'photo_spot': 'Eiffel Tower Sunset'},
{'time': '20:00', 'name': 'French Dinner', 'location': 'Restaurant', 'photo_spot': 'Romantic Restaurant'}
]
# Generate journal
journal = generator.generate_daily_journal(1, sample_activities)
save_content_to_file(journal, f"{destination.lower()}_journal_day1.md")
# Generate guide
guide = generator.generate_travel_guide({})
save_content_to_file(guide, f"{destination.lower()}_guide.md")
# Generate stories
stories = generator.generate_interesting_stories()
save_content_to_file(stories, f"{destination.lower()}_stories.md")
print(f"\n📝 Generated travel experience content for {destination}")
print(f"💑 Persona: {persona}")
if __name__ == "__main__":
main()
FILE:references/destination_templates.md
# Destination Content Templates
## Quick Destination Research Checklist
Before generating content for any destination, research:
- [ ] **Current season/weather**: What to expect, what to pack
- [ ] **Must-see attractions**: Top 3-5 landmarks or experiences
- [ ] **Local cuisine**: Signature dishes and dining experiences
- [ ] **Transportation**: How to get around (public transit, walking, taxis)
- [ ] **Cultural highlights**: Festivals, events, unique customs
- [ ] **Safety considerations**: Areas to avoid, common scams
- [ ] **Entry requirements**: Visa, vaccination, travel insurance
- [ ] **Language basics**: Essential phrases
- [ ] **Budget considerations**: Average daily costs
- [ ] **Photography tips**: Best times, iconic shots
## City-Specific Templates
### Paris, France
**Seasonal Highlights:**
- Spring: Cherry blossoms, cafe terraces
- Summer: Seine River cruises, open-air markets
- Fall: Fashion week, cozy bistros
- Winter: Christmas markets, indoor museums
**Signature Experiences:**
- Eiffel Tower sunrise/sunset
- Louvre with skip-the-line tickets
- Montmartre artist squares
- Picnic at Champ de Mars
- Seine River dinner cruise
**Cultural Notes:**
- "Bonjour" when entering any establishment
- Dress nicely for dinners
- Tipping: round up or leave €1-2
- PDA: Moderate acceptance
**Photo Opportunities:**
- Trocadero for Eiffel Tower
- Pont Alexandre III at sunset
- Montmartre streets and Sacre-Coeur
- Shakespeare and Company bookstore
- Cafe de Flore people-watching
### Tokyo, Japan
**Seasonal Highlights:**
- Spring (March-May): Cherry blossoms (Sakura)
- Summer (June-Aug): Festivals (Matsuri), fireworks
- Fall (Sept-Nov): Autumn foliage, mild weather
- Winter (Dec-Feb): Illuminations, New Year
**Signature Experiences:**
- Senso-ji Temple in Asakusa
- Shibuya Crossing at rush hour
- TeamLab Borderless digital art
- Tsukiji Outer Market food tour
- Traditional ryokan stay
**Cultural Notes:**
- Bow when greeting
- No tipping
- Remove shoes indoors
- Quiet in trains and restaurants
- Slurping noodles is polite
**Photo Opportunities:**
- Shibuya Sky observation deck
- Arashiyama Bamboo Grove
- Fushimi Inari Shrine torii gates
- TeamLab Borderless interactive art
- Harajuku street fashion
### Barcelona, Spain
**Seasonal Highlights:**
- Spring: Beach weather, fewer crowds
- Summer: Beach season, nightlife, festivals
- Fall: Gastronomy season, pleasant weather
- Winter: Holiday markets, indoor activities
**Signature Experiences:**
- Sagrada Familia tour
- Park Guell sunset views
- Gothic Quarter walking tour
- La Boqueria Market food crawl
- Beach day at Barceloneta
**Cultural Notes:**
- "Hola" and formal greetings
- Lunch is late (2-4 PM), dinner is late (9-11 PM)
- Tipping: 5-10% or round up
- Siesta culture in some areas
- PDA: Generally accepted
**Photo Opportunities:**
- Park Guell mosaic bench
- Casa Batllo exterior
- Gothic Quarter narrow streets
- La Boqueria colorful stalls
- Barceloneta Beach sunset
### New York City, USA
**Seasonal Highlights:**
- Spring: Central Park bloom, outdoor dining
- Summer: Rooftop bars, outdoor concerts
- Fall: Fashion Week, Halloween parade
- Winter: Rockefeller Center, holiday displays
**Signature Experiences:**
- Broadway show
- Central Park pedicab ride
- Brooklyn Bridge walk
- Times Square at night
- Statue of Liberty ferry
**Cultural Notes:**
- Tipping 18-20% essential
- Walk left, stand right on escalators
- Large personal space bubble
- Casual dress acceptable
- PDA: Accepted but not excessive
**Photo Opportunities:**
- Top of the Rock skyline
- Brooklyn Bridge at sunrise
- Central Park Bow Bridge
- DUMBO waterfront
- Empire State Building observation deck
### Santorini, Greece
**Seasonal Highlights:**
- Spring: Wildflowers, fewer crowds
- Summer: Beach season, nightlife
- Fall: Harvest season, wine tours
- Winter: Quiet, budget-friendly
**Signature Experiences:**
- Oia sunset viewing
- Caldera boat tour
- Wine tasting at local vineyards
- Red Beach swimming
- Fira cliffside wandering
**Cultural Notes:**
- "Kalimera" (good morning) greetings
- Tipping: 10% or round up
- Later dining times (9-10 PM)
- Relaxed pace of life
- PDA: Accepted in tourist areas
**Photo Opportunities:**
- Blue domes of Oia
- Three Bells of Fira
- Imerovigli cliff edge
- Red Beach cliffs
- Amoudi Bay fishing boats
## Content Generation Patterns
### Vlog Opening Hooks
- "Hey everyone! I'm currently in [city], and it is absolutely breathtaking here..."
- "You won't believe where I am right now - welcome to [city]!"
- "Today I'm taking you along on my journey to [destination]..."
### Instagram Caption Templates
- **Romantic:** "Exploring [city] with my heart full 💕 [destination] never disappoints..."
- **Adventurous:** "Chasing sunsets and new memories in [city] ✈️"
- **Foodie:** "Eating my way through [city] - this [food] is unreal! 🍜"
- **Scenic:** "This view in [city] is straight out of a dream 🌅"
### Itinerary Structure
```
Day 1: Arrival & Orientation
- Morning: Arrive, check-in
- Afternoon: [Major landmark]
- Evening: [Romantic dinner]
Day 2: Cultural Immersion
- Morning: [Temple/Museum]
- Afternoon: [Local neighborhood]
- Evening: [Sunset activity]
Day 3: Adventure Day
- Full day: [Day trip or excursion]
- Evening: [Local entertainment]
```
## Hashtag Collections by Region
### Europe
#Europe #Eurotrip #Wanderlust #TravelGram #CityBreak #TravelEurope #EuroVibes #EuropeanSummer #TravelInspo
### Asia
#Asia #AsianTravel #SoutheastAsia #TravelAsia #AsianAdventure #EasternWanderlust #TravelGramAsia
### Americas
#USA #Americas #NorthAmerica #SouthAmerica #TravelAmerica #ExploreUSA #LatinAmerica
### General Travel
#TravelGram #Wanderlust #TravelPhotography #TravelBlogger #TravelInspo #TravelAddict #VacationMode #AdventureTime
FILE:references/cultural_etiquette.md
# Cultural Etiquette Guide
## General International Travel Tips
### Communication
- Research common greetings and gestures before travel
- Be mindful of personal space norms (varies by culture)
- Understand tipping expectations (Japan: no tip, USA: 15-20%, Europe: 10%)
- Learn basic phrases: hello, thank you, excuse me, bathroom
### Photography Etiquette
- Always ask permission before photographing people
- Respect "no photography" signs at religious sites
- Avoid photographing military or government buildings
- Be discreet in solemn places (memorials, cemeteries)
### Dress Code Guidelines
- Cover shoulders and knees when visiting religious sites
- Remove shoes when required (temples, homes, certain restaurants)
- Research beach attire norms for local standards
- Pack layers for conservative regions
## Regional Specifics
### Asia
#### Japan
- Bow when greeting, don't tip
- Remove shoes indoors, use slippers
- Don't eat while walking
- Quiet in public transportation
#### South Korea
- Use two hands when receiving items
- Remove shoes at homes and some restaurants
- No tipping expected
- Respect elders in seating arrangements
#### Southeast Asia (Thailand, Vietnam, Bali)
- Remove shoes at temples and homes
- Dress modestly at religious sites
- Respect the head, don't touch it
- Point with palm up, not finger
#### India
- Eat with right hand only
- Dress conservatively, especially women
- Ask before photographing ceremonies
- Respect caste and religious practices
### Europe
#### Western Europe (France, Germany, UK, Italy)
- Tipping 10% or round up
- Greet shopkeepers when entering
- Keep conversation volume moderate
- Punctuality important
#### Southern Europe (Spain, Greece, Portugal)
- Later dinner times (8-10 PM)
- Siesta culture in smaller towns
- More relaxed attitude toward time
- Social meal culture
#### Northern Europe (Scandinavia, Netherlands)
- Reserved social style
- Very punctual
- High English proficiency
- Sustainability focus
### Americas
#### United States
- Tipping 15-20% essential
- Personal space larger (arm's length)
- Casual dress acceptable
- Car culture, limited public transit
#### Latin America (Mexico, Brazil, Argentina)
- Physical contact in greetings
- Later meal times
- Dress slightly more formal
- Bargaining in markets
### Middle East & North Africa
- Conservative dress, especially for women
- Public displays of affection limited
- Avoid eating in public during Ramadan
- Respect religious prayer times
### Oceania
#### Australia
- Tipping not required
- Laid-back, egalitarian culture
- Beach etiquette important
- Respect indigenous sites
## Safety Considerations
### General Safety
- Research current travel advisories
- Register with embassy for extended stays
- Keep copies of important documents
- Use money belts in crowded areas
### Scams to Watch
- Overfriendly locals offering tours
- "Free" gifts that demand payment
- Taxi overcharging
- Distraction techniques
### Health & Medical
- Check vaccination requirements
- Purchase travel insurance
- Research local emergency numbers
- Bring prescription medications with prescriptions
## Relationship Travel Tips
### Romantic Destinations
- Consider cultural attitudes toward PDA
- Research honeymoon packages if applicable
- Look for couple activities (cooking classes, sunset cruises)
- Check for adult-only resorts if desired
### Planning Together
- Discuss budget expectations upfront
- Agree on activity vs. relaxation balance
- Consider each other's interests
- Plan surprise activities sparingly
### Photography Tips
- Ask locals to take couple photos
- Use selfie sticks or tripods for better angles
- Respect other tourists when posing
- Capture candid moments, not just posed shots