From db513fb6ae2a7ba44175d366331a3ea97812d787 Mon Sep 17 00:00:00 2001 From: Sean Sube Date: Sun, 19 May 2024 15:51:58 -0500 Subject: [PATCH] add prompt and title to render events --- adventure/models/event.py | 2 ++ adventure/render/comfy.py | 15 +++++++++++++-- adventure/render/prompt.py | 8 +++++++- client/src/events.tsx | 14 ++++++++++++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/adventure/models/event.py b/adventure/models/event.py index c59d063..fce3e77 100644 --- a/adventure/models/event.py +++ b/adventure/models/event.py @@ -161,7 +161,9 @@ class RenderEvent(BaseModel): """ paths: List[str] + prompt: str source: Union["GameEvent", WorldEntity] + title: str id: str = Field(default_factory=uuid) type: Literal["render"] = "render" diff --git a/adventure/render/comfy.py b/adventure/render/comfy.py index 26821bf..ab9ce29 100644 --- a/adventure/render/comfy.py +++ b/adventure/render/comfy.py @@ -268,22 +268,33 @@ def render_loop(): logger.info( "using existing images for event %s: %s", event, existing_images ) - broadcast(RenderEvent(paths=existing_images, source=event)) + broadcast( + RenderEvent( + paths=existing_images, + prompt="", + source=event, + title="Existing Images", + ) + ) continue # generate the prompt if isinstance(event, WorldEntity): logger.info("rendering entity %s", event.name) prompt = prompt_from_entity(event) + title = event.name # TODO: generate a real title else: logger.info("rendering event %s", event.id) prompt = prompt_from_event(event) + title = event.type # TODO: generate a real title # render or not if prompt: logger.debug("rendering prompt for event %s: %s", event, prompt) image_paths = generate_images(prompt, 2, prefix=prefix) - broadcast(RenderEvent(paths=image_paths, source=event)) + broadcast( + RenderEvent(paths=image_paths, prompt=prompt, source=event, title=title) + ) else: logger.warning("no prompt for event %s", event) diff --git a/adventure/render/prompt.py b/adventure/render/prompt.py index 7135f1c..e242651 100644 --- a/adventure/render/prompt.py +++ b/adventure/render/prompt.py @@ -136,8 +136,13 @@ def generate_keywords_from_scene(scene: str) -> List[str]: logger.debug("generating keywords from scene: %s", scene) # TODO: use a gpt2 model to generate keywords from scene + # hack for now: split on punctuation and whitespace - return re.split(r"\W+", scene) + words = re.split(r"\W+", scene) + + # downcase and remove empty strings + words = [word.lower() for word in words if word] + return words def generate_prompt_from_scene(scene: str, example_prompts: List[str]) -> str: @@ -146,6 +151,7 @@ def generate_prompt_from_scene(scene: str, example_prompts: List[str]) -> str: scene, example_prompts, ) + # generate prompt from scene and example prompts dungeon_master = get_dungeon_master() return dungeon_master( diff --git a/client/src/events.tsx b/client/src/events.tsx index 89ccb75..47a97ca 100644 --- a/client/src/events.tsx +++ b/client/src/events.tsx @@ -184,7 +184,7 @@ export function PlayerEventItem(props: EventItemProps) { export function RenderEventItem(props: EventItemProps) { const { event } = props; - const { images } = event; + const { images, prompt, title = 'Render' } = event; return @@ -192,7 +192,17 @@ export function RenderEventItem(props: EventItemProps) { - Render + {prompt} + } + /> {Object.entries(images).map(([name, image]) => openImage(image as string)}>