2024-05-09 02:11:16 +00:00
|
|
|
from json import loads
|
2024-05-12 20:47:18 +00:00
|
|
|
from typing import Any, Callable, Dict, List, Literal, Union
|
2024-05-12 05:08:53 +00:00
|
|
|
|
|
|
|
from pydantic import Field
|
2024-05-09 02:11:16 +00:00
|
|
|
|
2024-05-13 04:33:47 +00:00
|
|
|
from .base import BaseModel, dataclass, uuid
|
2024-05-09 02:11:16 +00:00
|
|
|
from .entity import Actor, Item, Room, WorldEntity
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class GenerateEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
A new entity has been generated.
|
|
|
|
"""
|
|
|
|
|
|
|
|
name: str
|
|
|
|
entity: WorldEntity | None = None
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["generate"] = "generate"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def from_name(name: str) -> "GenerateEvent":
|
|
|
|
return GenerateEvent(name=name)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def from_entity(entity: WorldEntity) -> "GenerateEvent":
|
|
|
|
return GenerateEvent(name=entity.name, entity=entity)
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class ActionEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
An actor has taken an action.
|
|
|
|
"""
|
|
|
|
|
|
|
|
action: str
|
2024-05-10 04:45:10 +00:00
|
|
|
parameters: Dict[str, bool | float | int | str]
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
room: Room
|
|
|
|
actor: Actor
|
|
|
|
item: Item | None = None
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["action"] = "action"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def from_json(json: str, room: Room, actor: Actor) -> "ActionEvent":
|
|
|
|
openai_json = loads(json)
|
|
|
|
return ActionEvent(
|
|
|
|
action=openai_json["function"],
|
|
|
|
parameters=openai_json["parameters"],
|
|
|
|
room=room,
|
|
|
|
actor=actor,
|
|
|
|
item=None,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class PromptEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
A prompt for an actor to take an action.
|
|
|
|
"""
|
|
|
|
|
|
|
|
prompt: str
|
|
|
|
room: Room
|
|
|
|
actor: Actor
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["prompt"] = "prompt"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class ReplyEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
An actor has replied with text.
|
|
|
|
|
|
|
|
This is the non-JSON version of an ActionEvent.
|
2024-05-19 20:27:56 +00:00
|
|
|
|
|
|
|
TODO: add the actor being replied to.
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
text: str
|
|
|
|
room: Room
|
|
|
|
actor: Actor
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["reply"] = "reply"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def from_text(text: str, room: Room, actor: Actor) -> "ReplyEvent":
|
|
|
|
return ReplyEvent(text=text, room=room, actor=actor)
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class ResultEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
A result of an action.
|
|
|
|
"""
|
|
|
|
|
|
|
|
result: str
|
|
|
|
room: Room
|
|
|
|
actor: Actor
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["result"] = "result"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class StatusEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
A status broadcast event with text.
|
|
|
|
"""
|
|
|
|
|
|
|
|
text: str
|
|
|
|
room: Room | None = None
|
|
|
|
actor: Actor | None = None
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["status"] = "status"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
|
2024-05-10 04:45:10 +00:00
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class SnapshotEvent(BaseModel):
|
2024-05-10 04:45:10 +00:00
|
|
|
"""
|
|
|
|
A snapshot of the world state.
|
|
|
|
|
|
|
|
This one is slightly unusual, because the world has already been dumped to a JSON-compatible dictionary.
|
|
|
|
That is especially important for the memory, which is a dictionary of actor names to lists of messages.
|
|
|
|
"""
|
|
|
|
|
|
|
|
world: Dict[str, Any]
|
|
|
|
memory: Dict[str, List[Any]]
|
|
|
|
step: int
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["snapshot"] = "snapshot"
|
2024-05-10 04:45:10 +00:00
|
|
|
|
|
|
|
|
2024-05-09 02:11:16 +00:00
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class PlayerEvent(BaseModel):
|
2024-05-09 02:11:16 +00:00
|
|
|
"""
|
|
|
|
A player joining or leaving the game.
|
|
|
|
"""
|
|
|
|
|
|
|
|
status: Literal["join", "leave"]
|
|
|
|
character: str
|
|
|
|
client: str
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["player"] = "player"
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
|
2024-05-12 05:08:53 +00:00
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class PlayerListEvent(BaseModel):
|
2024-05-12 05:08:53 +00:00
|
|
|
"""
|
|
|
|
A list of players in the game and the characters they are playing.
|
|
|
|
"""
|
|
|
|
|
|
|
|
players: Dict[str, str]
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["players"] = "players"
|
2024-05-12 05:08:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-13 04:33:47 +00:00
|
|
|
class RenderEvent(BaseModel):
|
2024-05-12 05:08:53 +00:00
|
|
|
"""
|
|
|
|
Images have been rendered.
|
|
|
|
"""
|
|
|
|
|
|
|
|
paths: List[str]
|
2024-05-19 20:51:58 +00:00
|
|
|
prompt: str
|
2024-05-12 20:47:18 +00:00
|
|
|
source: Union["GameEvent", WorldEntity]
|
2024-05-19 20:51:58 +00:00
|
|
|
title: str
|
2024-05-13 04:33:47 +00:00
|
|
|
id: str = Field(default_factory=uuid)
|
|
|
|
type: Literal["render"] = "render"
|
2024-05-12 05:08:53 +00:00
|
|
|
|
|
|
|
|
2024-05-09 02:11:16 +00:00
|
|
|
# event types
|
|
|
|
WorldEvent = ActionEvent | PromptEvent | ReplyEvent | ResultEvent | StatusEvent
|
2024-05-12 05:08:53 +00:00
|
|
|
PlayerEventType = PlayerEvent | PlayerListEvent
|
|
|
|
GameEvent = GenerateEvent | PlayerEventType | RenderEvent | WorldEvent
|
2024-05-09 02:11:16 +00:00
|
|
|
|
|
|
|
# callback types
|
|
|
|
EventCallback = Callable[[GameEvent], None]
|