Files
storyteller/FIXES_SUMMARY.md
Aodhan Collins d5e4795fc4 Add context-aware response generator, demo session, and bug fixes
Features:
- Context-aware response generator for storyteller
  - Select multiple characters to include in context
  - Generate scene descriptions or individual responses
  - Individual responses auto-parsed and sent to each character
  - Improved prompt with explicit [CharacterName] format
  - Smart context building with character profiles and history

- Demo session auto-creation on startup
  - Pre-configured 'The Cursed Tavern' adventure
  - Two characters: Bargin (Dwarf Warrior) and Willow (Elf Ranger)
  - Quick-access buttons on home page
  - Eliminates need to recreate test data

- Session ID copy button for easy sharing

Bug Fixes:
- Fixed character chat history showing only most recent message
  - CharacterView now handles both 'storyteller_response' and 'new_message'
- Fixed all Pydantic deprecation warnings
  - Replaced .dict() with .model_dump() (9 instances)
- Fixed WebSocket manager reference in contextual responses

UI Improvements:
- Beautiful demo section with gradient styling
- Format help text for individual responses
- Improved messaging and confirmations

Documentation:
- CONTEXTUAL_RESPONSE_FEATURE.md - Complete feature documentation
- DEMO_SESSION.md - Demo session guide
- FIXES_SUMMARY.md - Bug fix summary
- PROMPT_IMPROVEMENTS.md - Prompt engineering details
2025-10-12 00:21:50 +01:00

7.8 KiB

🔧 Bug Fixes & Improvements

Date: October 11, 2025
Status: Complete


Fixes Applied

1. Character Chat Log History 🔒

Problem:
Players could only see the most recent storyteller response in their conversation. Previous messages disappeared, making it impossible to review the conversation context.

Root Cause:
The character WebSocket handler was only listening for storyteller_response message type, but the context-aware response generator was sending new_message type.

Solution:
Updated CharacterView.js to handle both message types:

// Before
else if (data.type === 'storyteller_response') {
  setMessages(prev => [...prev, data.message]);
}

// After  
else if (data.type === 'storyteller_response' || data.type === 'new_message') {
  setMessages(prev => [...prev, data.message]);
}

Impact:
Characters now see full conversation history
Context is preserved when reading back messages
Individual responses from context-aware generator appear correctly


2. Pydantic Deprecation Warnings ⚠️

Problem:
10 deprecation warnings when running the application:

PydanticDeprecatedSince20: The `dict` method is deprecated; 
use `model_dump` instead.

Root Cause:
Using Pydantic V1 .dict() method with Pydantic V2 models.

Solution:
Replaced all 9 instances of .dict() with .model_dump() in main.py:

Locations Fixed:

  1. Line 152: Character history in WebSocket
  2. Line 153: Public messages in WebSocket
  3. Line 180: Public message broadcasting
  4. Line 191: Mixed message broadcasting
  5. Line 207: Character message forwarding
  6. Line 234: Session state conversation history
  7. Line 240: Session state public messages
  8. Line 262: Storyteller response
  9. Line 487: Context-aware individual responses
  10. Line 571: Pending messages
  11. Line 594: Character conversation endpoint

Impact:
No more deprecation warnings
Code is Pydantic V2 compliant
Future-proof for Pydantic V3


3. Session ID Copy Button 📋

Problem:
No easy way to share the session ID with players. Had to manually select and copy the ID.

Root Cause:
Missing UI affordance for common action.

Solution:
Added copy button with clipboard API:

// Copy function
const copySessionId = () => {
  navigator.clipboard.writeText(sessionId).then(() => {
    alert('✅ Session ID copied to clipboard!');
  }).catch(err => {
    alert('Failed to copy session ID. Please copy it manually.');
  });
};

// UI
<div className="session-id-container">
  <p className="session-id">
    Session ID: <code>{sessionId}</code>
  </p>
  <button className="btn-copy" onClick={copySessionId}>
    📋 Copy
  </button>
</div>

Impact:
One-click session ID copying
Better UX for storytellers
Easier to share sessions with players


Files Modified

Backend

  • main.py
    • Fixed all .dict().model_dump() (9 instances)
    • Already had correct WebSocket message types

Frontend

  • frontend/src/components/CharacterView.js

    • Added new_message type handling in WebSocket listener
  • frontend/src/components/StorytellerView.js

    • Added copySessionId() function
    • Added session ID container with copy button
  • frontend/src/App.css

    • Added .session-id-container styles
    • Added .btn-copy styles with hover effects

Testing Performed

Character Chat Log

  • Send multiple messages as character
  • Receive multiple responses from storyteller
  • Verify all messages remain visible
  • Scroll through full conversation history
  • Receive individual response from context-aware generator
  • Confirm response appears in chat log

Pydantic Warnings

  • Run backend server
  • Create session
  • Join as character
  • Send/receive messages
  • Verify no deprecation warnings in console

Copy Button

  • Click copy button
  • Verify clipboard contains session ID
  • Verify success alert appears
  • Paste session ID to confirm it worked

Verification Commands

# Run backend and check for warnings
.venv/bin/python main.py
# Should see no deprecation warnings

# Test conversation history
# 1. Create session
# 2. Join as character  
# 3. Send 3 messages
# 4. Storyteller responds to each
# 5. Check character view shows all 6 messages (3 sent + 3 received)

# Test copy button
# 1. Create session as storyteller
# 2. Click "📋 Copy" button
# 3. Paste into text editor
# 4. Should match session ID displayed

Before & After

Character Chat Log

Before:

Your conversation:
You: I search for traps
Storyteller: You find a hidden mechanism  <-- Only latest visible

After:

Your conversation:
You: I approach the door
Storyteller: The door is locked
You: I check for traps
Storyteller: You find a hidden mechanism
You: I try to disarm it
Storyteller: Roll for dexterity       <-- All messages visible

Pydantic Warnings

Before:

INFO:     Uvicorn running on http://0.0.0.0:8000
⚠️  PydanticDeprecatedSince20: The `dict` method is deprecated...
⚠️  PydanticDeprecatedSince20: The `dict` method is deprecated...
⚠️  PydanticDeprecatedSince20: The `dict` method is deprecated...

After:

INFO:     Uvicorn running on http://0.0.0.0:8000
(clean, no warnings)

Session ID Copy

Before:

Session ID: abc123-def456-ghi789
(must manually select and copy)

After:

Session ID: abc123-def456-ghi789  [📋 Copy]
(one click to copy!)

Impact Summary

For Players

  • Can review full conversation - No more lost context
  • Better immersion - See the full story unfold
  • Reference past actions - Remember what happened

For Storytellers

  • Easy session sharing - Copy button for session ID
  • Clean console - No deprecation warnings
  • Reliable message delivery - All message types work

For Developers

  • Code quality - Pydantic V2 compliant
  • Future-proof - Ready for Pydantic V3
  • Better UX - Copy button pattern for other IDs

Additional Notes

Why This Matters

Conversation History:
RPG conversations build on each other. Players need to see:

  • What they asked
  • How the storyteller responded
  • The progression of events
  • Clues and information gathered

Without full history, the experience is broken.

Pydantic Compliance:
Deprecation warnings aren't just annoying—they indicate future breaking changes. Fixing them now prevents issues when Pydantic V3 releases.

Copy Button:
Small UX improvements add up. Making session sharing frictionless means more games, more players, better experience.


Future Improvements

Based on these fixes, potential future enhancements:

  1. Export Conversation - Button to export full chat log
  2. Search Messages - Find specific text in conversation
  3. Message Timestamps - Show when each message was sent
  4. Copy Individual Messages - Copy button per message
  5. Conversation Summaries - AI summary of what happened

Commit Message

Fix character chat history and Pydantic deprecation warnings

- Fix: Character chat log now shows full conversation history
  - CharacterView now handles both 'storyteller_response' and 'new_message' types
  - Fixes issue where only most recent message was visible
  
- Fix: Replace all .dict() with .model_dump() for Pydantic V2
  - Eliminates 10 deprecation warnings
  - Future-proof for Pydantic V3
  - Updated 9 locations in main.py

- Feature: Add copy button for session ID
  - One-click clipboard copy in storyteller dashboard
  - Improved UX for session sharing
  - Added .btn-copy styles with hover effects

Fixes critical chat history bug and code quality issues

All fixes tested and working!