dreamland / core /models.py
panda-lsy
feat: initialize DreamLand project scaffold
364907d
Raw
History Blame Contribute Delete
3.27 kB
"""Core data models for DreamLand."""
from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional
import uuid
def _new_id() -> str:
"""Generate a short unique ID."""
return uuid.uuid4().hex[:8]
@dataclass
class Entity:
"""A world entity extracted from or generated from a dream."""
id: str = field(default_factory=_new_id)
name: str = ""
entity_type: str = "" # "location" | "npc" | "item" | "quest"
description: str = ""
dream_id: str = ""
created_at: str = field(default_factory=lambda: datetime.now().isoformat())
metadata: dict = field(default_factory=dict)
# NPC-specific fields
dialog: str = ""
location_id: str = ""
# Quest-specific fields
quest_status: str = "" # "active" | "completed"
giver_id: str = ""
def to_dict(self) -> dict:
"""Serialize to dict for JSON storage."""
return {
"id": self.id,
"name": self.name,
"type": self.entity_type,
"description": self.description,
"dream_source": self.dream_id,
"created_at": self.created_at,
"metadata": self.metadata,
"dialog": self.dialog,
"location_id": self.location_id,
"quest_status": self.quest_status,
"giver_id": self.giver_id,
}
@classmethod
def from_dict(cls, data: dict) -> "Entity":
"""Deserialize from dict."""
return cls(
id=data.get("id", ""),
name=data.get("name", ""),
entity_type=data.get("type", ""),
description=data.get("description", ""),
dream_id=data.get("dream_source", ""),
created_at=data.get("created_at", ""),
metadata=data.get("metadata", {}),
dialog=data.get("dialog", ""),
location_id=data.get("location_id", ""),
quest_status=data.get("quest_status", ""),
giver_id=data.get("giver_id", ""),
)
@dataclass
class DreamEntry:
"""A single dream record."""
id: str = field(default_factory=_new_id)
raw_text: str = ""
entities: list[Entity] = field(default_factory=list)
emotions: list[str] = field(default_factory=list)
summary: str = ""
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
has_image: bool = False
def to_dict(self) -> dict:
return {
"id": self.id,
"raw_text": self.raw_text,
"entities_extracted": [e.id for e in self.entities],
"emotions": self.emotions,
"summary": self.summary,
"timestamp": self.timestamp,
"has_image": self.has_image,
}
@dataclass
class DreamParseResult:
"""Structured output from the dream parser."""
entities: list[Entity] = field(default_factory=list)
emotions: list[str] = field(default_factory=list)
summary: str = ""
@dataclass
class WorldContext:
"""Context passed to generators about the current world state."""
nearby_locations: list[str] = field(default_factory=list)
existing_npcs: list[str] = field(default_factory=list)
emotions: list[str] = field(default_factory=list)
total_entities: int = 0