Storyteller / app.py
mecoffey's picture
testing
33e0d93 verified
Raw
History Blame Contribute Delete
2.25 kB
import os
import uuid
import datetime
import gradio as gr
from transformers import pipeline
import spaces
import torch
import csv
DATA_DIR = os.path.join(os.getcwd(), "session_data")
os.makedirs(DATA_DIR, exist_ok=True)
pipe = pipeline("text-generation", model="mecoffey/NPC_brain", trust_remote_code=True)
SYSTEM_PROMPT = (
"You are a creative storyteller. "
"Write vivid, engaging short stories with clear structure and imaginative detail."
" Keep Stories to a maximum 5 paragraphs."
)
def make_session_csv():
session_id = uuid.uuid4().hex
return os.path.join(DATA_DIR, f"story_session_{session_id}.csv")
def append_to_csv(csv_path, prompt, story):
is_new = not os.path.exists(csv_path)
with open(csv_path, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
if is_new:
writer.writerow(["timestamp", "prompt", "story"])
writer.writerow([
datetime.datetime.utcnow().isoformat(),
prompt,
story,
])
def read_csv_rows(csv_path):
if not csv_path or not os.path.exists(csv_path):
return []
with open(csv_path, newline="", encoding="utf-8") as f:
reader = csv.reader(f)
rows = list(reader)
return rows[1:] if len(rows) > 1 else []
@spaces.GPU
def ask(message, session_csv):
if session_csv is None:
session_csv = make_session_csv()
prompt = f"{message}\n\nDescribe:"
response = pipe(prompt, return_full_text=False, max_new_tokens=256)
story = response[0]["generated_text"].strip()
append_to_csv(session_csv, message, story)
csv_rows = read_csv_rows(session_csv)
return story, csv_rows, session_csv
with gr.Blocks() as demo:
text_in = gr.Textbox(label="Story Idea", placeholder="A girl in a red hood...")
text_out = gr.Textbox(label="Story", interactive=False)
csv_table = gr.Dataframe(
headers=["Timestamp", "Prompt", "Story"],
interactive=False,
row_count=(1, "dynamic"),
)
session_csv_state = gr.State(value=None)
btn = gr.Button("Write!")
btn.click(
fn=ask,
inputs=[text_in, session_csv_state],
outputs=[text_out, csv_table, session_csv_state],
)
demo.launch()