Gemini-based story generator for children's books
Project description
DailyStories Generator
A Python library for generating children's storybooks using Google's Gemini AI.
Installation
# From PyPI
pip install dailystories-generator
# Or with uv
uv pip install dailystories-generator
Building and Publishing
Build
./build.sh
This creates distribution files in dist/ directory.
Publish to PyPI
- Get a PyPI API token from https://pypi.org/manage/account/token/
- Set the token:
export PYPI_TOKEN="pypi-your-token-here"
- Publish:
./publish.sh
The publish script will automatically build the package before publishing.
Quick Test
# Set your API key
export GOOGLE_API_KEY="your-gemini-api-key-here"
# Run a simple test
uv run python test.py
# Or test outline-only (faster)
uv run python test.py --outline-only
# Or test without images (faster)
uv run python test.py --no-images
Usage
from storygenerator import StoryGenerator, GenerationRequest, UpdateType
async def on_update(update):
print(f"Update: {update.type}")
if update.type == UpdateType.PAGE_COMPLETE:
print(f"Page {update.data['page_number']} completed")
generator = StoryGenerator(gemini_api_key="your-api-key")
request = GenerationRequest(
title="The Adventure Begins",
summary="A tale of courage and friendship",
num_pages=10,
child_name="Alex",
child_age=6,
language="English",
illustration_style="watercolor",
generate_images=True,
)
story = await generator.generate(request, on_update=on_update)
print(f"Story generated with {len(story.pages)} pages")
Features
- Async story generation with Gemini AI
- Optional image generation
- Support for multiple reference images
- Type-safe with full type annotations
- Callback-based progress updates
- Prompt optimization system for iterative improvement
Prompt Optimization
The library includes a powerful prompt optimization system that automatically improves story generation prompts through iterative evaluation and feedback.
How It Works
- Generate story content (outline or pages)
- Evaluate across 11 quality categories (1-5 scale with explanations)
- Improve the prompt based on evaluation feedback
- Validate that all template placeholders are preserved
- Track scores in
statistics.csvfor analysis - Repeat for N iterations
Evaluation Categories
The system evaluates generated content on:
- creativity - Originality and imaginativeness
- age_appropriateness - Suitable content and vocabulary for target age
- coherence - Logical flow and narrative consistency
- engagement - How captivating for young readers
- language_quality - Grammar and writing style
- plot_structure - Clear beginning/middle/end
- character_development - Growth and relatability
- character_introduction - How well characters are established
- emotional_resonance - Emotional depth and impact
- pacing - Story rhythm and transitions
- tone_consistency - Maintaining age-appropriate tone
Running Optimization
# Set your API key
export GOOGLE_API_KEY="your-gemini-api-key-here"
# Optimize the outline prompt (50 iterations)
uv run python optimize_prompts.py --mode outline --iterations 50 \
--child-name Ludwig --child-age 6 \
--title "The Magical Adventure" \
--summary "A child discovers magic and goes on an adventure" \
--language Norwegian
# Optimize the page generation prompt (20 iterations)
uv run python optimize_prompts.py --mode pages --iterations 20 \
--child-name Emma --child-age 7 \
--num-pages 5 \
--language English
Command Line Options
--mode- Type of prompt to optimize:outlineorpages(required)--iterations- Number of optimization iterations (default: 10)--child-name- Child's name for test story (default: Alex)--child-age- Child's age for test story (default: 6)--title- Story title (default: The Magical Adventure)--summary- Story theme/summary--num-pages- Number of pages (default: 5)--language- Story language (default: English)
Output
The optimization system produces:
-
Updated prompt templates in
prompt_templates/story_outline_prompt.txtstory_page_prompt.txt
-
Statistics CSV (
statistics.csv) with columns:- timestamp, mode, iteration, prompt_version
- All 11 category scores (1-5)
- average_score
-
Console output showing:
- Current iteration progress
- Evaluation scores per category
- Improvement suggestions
- Placeholder validation results
Analyzing Results
Use the statistics.csv file to plot score trajectories over iterations:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('statistics.csv')
df_outline = df[df['mode'] == 'outline']
# Plot trajectory for each category
for category in ['creativity', 'engagement', 'coherence']:
plt.plot(df_outline['iteration'], df_outline[category], label=category)
plt.xlabel('Iteration')
plt.ylabel('Score (1-5)')
plt.legend()
plt.title('Prompt Optimization Progress')
plt.show()
Automatic Retry on Placeholder Loss
The system automatically validates that all template placeholders (e.g., {child_name}, {story_so_far}) are preserved during optimization. If the LLM forgets a placeholder, it receives clear feedback and retries up to 5 times before failing.
This ensures the system can run autonomously for hours without manual intervention.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file storygenerator-0.1.1.tar.gz.
File metadata
- Download URL: storygenerator-0.1.1.tar.gz
- Upload date:
- Size: 26.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18e61f1ec0cbad91d11f0894c00cb0c537827acc7a04b47267dd1b498793c42a
|
|
| MD5 |
0e2ad239f1617ef8eeeb92d4934773ca
|
|
| BLAKE2b-256 |
bfecd8536bbb1703c4de2b10d3c8ee29de702583a540a3221c6bf53428a61b22
|
File details
Details for the file storygenerator-0.1.1-py3-none-any.whl.
File metadata
- Download URL: storygenerator-0.1.1-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7462194c3b5d62b49825f4cf1ff7a30974866101a69191f685c82d5f7f19a13c
|
|
| MD5 |
066371ad80c9f937c999bfc93e28b488
|
|
| BLAKE2b-256 |
7a23f6d9f1391b30e4f5f1dc9bb8d2efb90473cfa0ce6b01e9e22abbf679770d
|