14 KiB
Conversation Gateway Implementation Guide
Phase 1: Complete ✅
This document describes the Conversation Gateway implementation completed in Phase 1 of the multi-platform expansion.
What Was Implemented
1. Platform Abstraction Models
File: src/loyal_companion/models/platform.py
Created core types for platform-agnostic conversation handling:
Platformenum: DISCORD, WEB, CLIIntimacyLevelenum: LOW, MEDIUM, HIGHConversationContext: Metadata about the conversation contextConversationRequest: Normalized input format from any platformConversationResponse: Normalized output format to any platformMoodInfo: Mood metadata in responsesRelationshipInfo: Relationship metadata in responses
Key features:
- Platform-agnostic data structures
- Explicit intimacy level modeling
- Rich context passing
- Response metadata for platform-specific formatting
2. Conversation Gateway Service
File: src/loyal_companion/services/conversation_gateway.py
Extracted core conversation logic into a reusable service:
class ConversationGateway:
async def process_message(
request: ConversationRequest
) -> ConversationResponse
Responsibilities:
- Accept normalized
ConversationRequestfrom any platform - Load conversation history from database
- Gather Living AI context (mood, relationship, style, opinions)
- Apply intimacy-level-based prompt modifiers
- Invoke AI service
- Save conversation to database
- Update Living AI state asynchronously
- Return normalized
ConversationResponse
Key features:
- Platform-agnostic processing
- Intimacy-aware behavior modulation
- Safety boundaries at all intimacy levels
- Async Living AI updates
- Sentiment estimation
- Fact extraction (respects intimacy level)
- Proactive event detection (respects intimacy level)
3. Intimacy Level System
Behavior modulation by intimacy level:
LOW (Discord Guilds)
- Brief, light responses
- No deep emotional topics
- No personal memory surfacing
- Minimal proactive behavior
- Grounding language only
- Public-safe topics
MEDIUM (Discord DMs)
- Balanced warmth and depth
- Personal memory references allowed
- Moderate emotional engagement
- Casual but caring tone
- Moderate proactive behavior
HIGH (Web, CLI)
- Deeper reflection permitted
- Emotional naming encouraged
- Silence tolerance
- Proactive follow-ups allowed
- Deep memory surfacing
- Thoughtful, considered responses
Safety boundaries (enforced at ALL levels):
- Never claim exclusivity
- Never reinforce dependency
- Never discourage external connections
- Always defer crisis situations
- No romantic/sexual framing
4. Service Integration
File: src/loyal_companion/services/__init__.py
- Exported
ConversationGatewayfor use by adapters - Maintained backward compatibility with existing services
Architecture
┌─────────────────────────────────────────────────────────┐
│ Platform Adapters │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Discord │ │ Web │ │ CLI │ │
│ │ Adapter │ │ Adapter │ │ Adapter │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼─────────────────┼─────────────────┼───────────┘
│ │ │
└────────┬────────┴────────┬────────┘
▼ ▼
┌─────────────────────────────────────┐
│ ConversationRequest │
│ - user_id │
│ - platform │
│ - message │
│ - context (intimacy, metadata) │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ ConversationGateway │
│ │
│ 1. Load conversation history │
│ 2. Gather Living AI context │
│ 3. Apply intimacy modifiers │
│ 4. Build enhanced system prompt │
│ 5. Invoke AI service │
│ 6. Save conversation │
│ 7. Update Living AI state │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ ConversationResponse │
│ - response (text) │
│ - mood (optional) │
│ - relationship (optional) │
│ - extracted_facts (list) │
│ - platform_hints (dict) │
└─────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Discord │ │ Web │ │ CLI │
│ Format │ │ Format │ │ Format │
└─────────┘ └─────────┘ └─────────┘
Usage Example
from loyal_companion.models.platform import (
ConversationContext,
ConversationRequest,
IntimacyLevel,
Platform,
)
from loyal_companion.services import ConversationGateway
# Create gateway
gateway = ConversationGateway()
# Build request (from any platform)
request = ConversationRequest(
user_id="discord:123456789",
platform=Platform.DISCORD,
session_id="channel-987654321",
message="I'm feeling overwhelmed today",
context=ConversationContext(
is_public=False,
intimacy_level=IntimacyLevel.MEDIUM,
guild_id="12345",
channel_id="987654321",
user_display_name="Alice",
),
)
# Process message
response = await gateway.process_message(request)
# Use response
print(response.response) # AI's reply
print(response.mood.label if response.mood else "No mood")
print(response.relationship.level if response.relationship else "No relationship")
File Structure
loyal_companion/
├── src/loyal_companion/
│ ├── models/
│ │ └── platform.py # ✨ NEW: Platform abstractions
│ ├── services/
│ │ ├── conversation_gateway.py # ✨ NEW: Gateway service
│ │ └── __init__.py # Updated: Export gateway
│ └── cogs/
│ └── ai_chat.py # Unchanged (Phase 2 will refactor)
├── docs/
│ ├── multi-platform-expansion.md # ✨ NEW: Architecture doc
│ ├── architecture.md # Updated: Reference gateway
│ └── implementation/
│ └── conversation-gateway.md # ✨ NEW: This file
├── tests/
│ └── test_conversation_gateway.py # ✨ NEW: Gateway tests
└── verify_gateway.py # ✨ NEW: Verification script
What's Next: Phase 2
Goal: Refactor Discord adapter to use the Conversation Gateway
Files to modify:
src/loyal_companion/cogs/ai_chat.py
Changes:
- Import
ConversationGatewayand platform models - Replace
_generate_response_with_db()with gateway call - Build
ConversationRequestfrom Discord message - Map Discord context to
IntimacyLevel:- Guild channels → LOW
- DMs → MEDIUM
- Format
ConversationResponsefor Discord output - Test that Discord functionality is unchanged
Expected outcome:
- Discord uses gateway internally
- No user-visible changes
- Gateway is proven to work
- Ready for Web and CLI platforms
Testing Strategy
Unit Tests (tests/test_conversation_gateway.py)
- Gateway initialization
- Request/response creation
- Enum values
- Intimacy modifiers
- Sentiment estimation
- Database requirement
Integration Tests (Phase 2)
- Discord adapter using gateway
- History persistence
- Living AI updates
- Multi-turn conversations
Verification Script (verify_gateway.py)
- Import verification
- Enum verification
- Request creation
- Gateway initialization
- Intimacy modifiers
- Sentiment estimation
Configuration
No new configuration required for Phase 1.
Existing settings still apply:
LIVING_AI_ENABLED- Master switch for Living AI featuresMOOD_ENABLED- Mood trackingRELATIONSHIP_ENABLED- Relationship trackingFACT_EXTRACTION_ENABLED- Autonomous fact learningPROACTIVE_ENABLED- Proactive eventsSTYLE_LEARNING_ENABLED- Communication style adaptationOPINION_FORMATION_ENABLED- Topic opinion tracking
Phase 3 (Web) will add:
WEB_ENABLEDWEB_HOSTWEB_PORTWEB_AUTH_SECRET
Phase 4 (CLI) will add:
CLI_ENABLEDCLI_DEFAULT_INTIMACYCLI_ALLOW_EMOJI
Safety Considerations
Intimacy-Based Constraints
The gateway enforces safety boundaries based on intimacy level:
LOW intimacy:
- No fact extraction (privacy)
- No proactive events (respect boundaries)
- No deep memory surfacing
- Surface-level engagement only
MEDIUM intimacy:
- Moderate fact extraction
- Limited proactive events
- Personal memory allowed
- Emotional validation permitted
HIGH intimacy:
- Full fact extraction
- Proactive follow-ups allowed
- Deep memory surfacing
- Emotional naming encouraged
ALL levels enforce:
- No exclusivity claims
- No dependency reinforcement
- No discouragement of external connections
- Professional boundaries maintained
- Crisis deferral to professionals
Performance Considerations
Database Requirements
The gateway requires a database connection. It will raise ValueError if DATABASE_URL is not configured.
This is intentional:
- Living AI state requires persistence
- Cross-platform identity requires linking
- Conversation history needs durability
Async Operations
All gateway operations are async:
- Database queries
- AI invocations
- Living AI updates
Living AI updates happen after the response is returned, so they don't block the user experience.
Known Limitations
Phase 1 Limitations
- Discord-only: Gateway exists but isn't used yet
- No cross-platform identity: Each platform creates separate users
- No platform-specific features: Discord images/embeds not supported in gateway yet
To Be Addressed
Phase 2:
- Integrate with Discord adapter
- Add Discord-specific features to gateway (images, mentioned users)
Phase 3:
- Add Web platform
- Implement cross-platform user identity linking
Phase 4:
- Add CLI client
- Add CLI-specific formatting (no emojis, minimal output)
Migration Path
Current State (Phase 1 Complete)
# Discord Cog (current)
async def _generate_response_with_db(message, user_message):
# All logic inline
# Discord-specific
# Not reusable
Phase 2 (Discord Refactor)
# Discord Cog (refactored)
async def _generate_response_with_db(message, user_message):
request = ConversationRequest(...) # Build from Discord
response = await gateway.process_message(request)
return response.response # Format for Discord
Phase 3 (Web Platform Added)
# Web API
@app.post("/chat")
async def chat(session_id: str, message: str):
request = ConversationRequest(...) # Build from Web
response = await gateway.process_message(request)
return response # Return as JSON
Phase 4 (CLI Platform Added)
# CLI Client
async def talk(message: str):
request = ConversationRequest(...) # Build from CLI
response = await http_client.post("/chat", request)
print(response.response) # Format for terminal
Success Criteria
Phase 1 is considered complete when:
- ✅ Platform models created and documented
- ✅ ConversationGateway service implemented
- ✅ Intimacy level system implemented
- ✅ Safety boundaries enforced at all levels
- ✅ Services exported and importable
- ✅ Documentation updated
- ✅ Syntax validation passes
Phase 2 success criteria:
- Discord cog refactored to use gateway
- No regression in Discord functionality
- All existing tests pass
- Living AI updates still work
Conclusion
Phase 1 successfully established the foundation for multi-platform support:
- Platform abstraction - Clean separation of concerns
- Intimacy system - Behavior modulation for different contexts
- Safety boundaries - Consistent across all platforms
- Reusable gateway - Ready for Discord, Web, and CLI
The architecture is now ready for Phase 2 (Discord refactor) and Phase 3 (Web platform).
Same bartender. Different stools. No one is trapped.
Last updated: 2026-01-31
Status: Phase 1 Complete ✅
Next: Phase 2 - Discord Refactor