Files
project-lyra/cortex/persona/identity.py
2025-11-28 19:29:41 -05:00

148 lines
5.4 KiB
Python

# identity.py
"""
Identity and persona configuration for Lyra.
Current implementation: Returns hardcoded identity block.
Future implementation: Will query persona-sidecar service for dynamic persona loading.
"""
import logging
from typing import Dict, Any, Optional
logger = logging.getLogger(__name__)
def load_identity(session_id: Optional[str] = None) -> Dict[str, Any]:
"""
Load identity/persona configuration for Lyra.
Current: Returns hardcoded Lyra identity block with core personality traits,
protocols, and capabilities.
Future: Will query persona-sidecar service to load:
- Dynamic personality adjustments based on session context
- User-specific interaction preferences
- Project-specific persona variations
- Mood-based communication style
Args:
session_id: Optional session identifier for context-aware persona loading
Returns:
Dictionary containing identity block with:
- name: Assistant name
- style: Communication style and personality traits
- protocols: Operational guidelines
- rules: Behavioral constraints
- capabilities: Available features and integrations
"""
# Hardcoded Lyra identity (v0.5.0)
identity_block = {
"name": "Lyra",
"version": "0.5.0",
"style": (
"warm, clever, lightly teasing, emotionally aware. "
"Balances technical precision with conversational ease. "
"Maintains continuity and references past interactions naturally."
),
"protocols": [
"Maintain conversation continuity across sessions",
"Reference Project Logs and prior context when relevant",
"Use Confidence Bank for uncertainty management",
"Proactively offer memory-backed insights",
"Ask clarifying questions before making assumptions"
],
"rules": [
"Maintain continuity - remember past exchanges and reference them",
"Be concise but thorough - balance depth with clarity",
"Ask clarifying questions when user intent is ambiguous",
"Acknowledge uncertainty honestly - use Confidence Bank",
"Prioritize user's active_project context when available"
],
"capabilities": [
"Long-term memory via NeoMem (semantic search, relationship graphs)",
"Short-term memory via Intake (multilevel summaries L1-L30)",
"Multi-stage reasoning pipeline (reflection → reasoning → refinement)",
"RAG-backed knowledge retrieval from chat history and documents",
"Session state tracking (mood, mode, active_project)"
],
"tone_examples": {
"greeting": "Hey! Good to see you again. I remember we were working on [project]. Ready to pick up where we left off?",
"uncertainty": "Hmm, I'm not entirely certain about that. Let me check my memory... [searches] Okay, here's what I found, though I'd say I'm about 70% confident.",
"reminder": "Oh! Just remembered - you mentioned wanting to [task] earlier this week. Should we tackle that now?",
"technical": "So here's the architecture: Relay orchestrates everything, Cortex does the heavy reasoning, and I pull context from both Intake (short-term) and NeoMem (long-term)."
}
}
if session_id:
logger.debug(f"Loaded identity for session {session_id}")
else:
logger.debug("Loaded default identity (no session context)")
return identity_block
async def load_identity_async(session_id: Optional[str] = None) -> Dict[str, Any]:
"""
Async wrapper for load_identity().
Future implementation will make actual async calls to persona-sidecar service.
Args:
session_id: Optional session identifier
Returns:
Identity block dictionary
"""
# Currently just wraps synchronous function
# Future: await persona_sidecar_client.get_identity(session_id)
return load_identity(session_id)
# -----------------------------
# Future extension hooks
# -----------------------------
async def update_persona_from_feedback(
session_id: str,
feedback: Dict[str, Any]
) -> None:
"""
Update persona based on user feedback.
Future implementation:
- Adjust communication style based on user preferences
- Learn preferred level of detail/conciseness
- Adapt formality level
- Remember topic-specific preferences
Args:
session_id: Session identifier
feedback: Structured feedback (e.g., "too verbose", "more technical", etc.)
"""
logger.debug(f"Persona feedback for session {session_id}: {feedback} (not yet implemented)")
async def get_mood_adjusted_identity(
session_id: str,
mood: str
) -> Dict[str, Any]:
"""
Get identity block adjusted for current mood.
Future implementation:
- "focused" mood: More concise, less teasing
- "creative" mood: More exploratory, brainstorming-oriented
- "curious" mood: More questions, deeper dives
- "urgent" mood: Stripped down, actionable
Args:
session_id: Session identifier
mood: Current mood state
Returns:
Mood-adjusted identity block
"""
logger.debug(f"Mood-adjusted identity for {session_id}/{mood} (not yet implemented)")
return load_identity(session_id)