iLL-Ai-Book_writer / book_generator.py
ILLERRAPS's picture
Upload folder using huggingface_hub
a30be88 verified
import os
from langchain_groq import ChatGroq
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from typing import Dict
import gradio as gr # Import Gradio
# Step 3: Set the environment variable for the Groq API Key
os.environ["GROQ_API_KEY"] = "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" # Use provided secret key
# Step 4: Define helper functions for structured book generation
def create_book_agent(
model_name: str = os.getenv("MODEL_NAME", "llama-3.1-8b-instant"), # Use environment variable for model name
temperature: float = 0.7,
max_tokens: int = 8000, # Set max_tokens to 8000
**kwargs
) -> ChatGroq:
"""Create a LangChain agent for book writing."""
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a creative writer. Write high-quality, engaging books for any genre."),
("human", "{input}")
])
llm = ChatGroq(model=model_name, temperature=temperature, max_tokens=max_tokens, **kwargs) # Removed token parameter
chain = prompt_template | llm | StrOutputParser()
return chain
def generate_chapter(title: str, agent):
"""Generate a full chapter given a title."""
query = f"Write a detailed chapter titled '{title}'"
try:
# Yield chunks of text instead of returning all at once
for chunk in agent.invoke({"input": query}):
yield chunk # Yield each chunk as it is generated
except Exception as e:
print(f"An error occurred while generating the chapter: {e}")
yield ""
def write_book(title: str, outline: Dict[str, str]):
"""
Generate a complete book.
Args:
title (str): The title of the book.
outline (Dict[str, str]): A dictionary with chapter titles as keys.
Returns:
str: The full book as a single string.
"""
book = f"# {title}\n\n"
for chapter_title in outline.keys():
book += f"## {chapter_title}\n\n"
agent = create_book_agent() # Create a new agent for each chapter
for chapter_text in generate_chapter(chapter_title, agent):
book += chapter_text # Append each chunk to the book
return book # Return the complete book
# Step 6: Gradio interface
def gradio_interface(api_key: str = ""):
"""Create a Gradio interface for book generation."""
with gr.Blocks() as demo:
gr.Markdown("## Book Generator")
gr.Markdown("This application was created by iLL-Ai AaronAllton and a team of Groq agents that write books.") # Updated note
user_input = gr.Textbox(label="Enter Book Title, Number of Chapters, and Type of Book (e.g., 'My Book, 10, Novel')", placeholder="Title, Chapters, Type") # Combined input
generate_button = gr.Button("Generate Outline")
output = gr.Textbox(label="Generated Book", interactive=False)
def generate_book_interface(user_input):
try:
# Ensure the input is properly formatted
parts = user_input.split(",")
if len(parts) < 3:
return "Please provide input in the format: 'Title, Number of Chapters, Type of Book'."
title = parts[0].strip() # First part is the title
outline = parts[1].strip() if len(parts) > 1 else "1" # Default to 1 chapter if not provided
book_type = parts[2].strip() if len(parts) > 2 else "General" # Default to "General" if not provided
outline_dict = {}
if not outline.strip(): # Check if outline is empty
return "Please provide a valid outline." # Prompt user for valid outline
# Generate outline based on user input and book type
num_chapters = int(outline) # Extract number of chapters
outline_dict = {f"{book_type} Chapter {i}": None for i in range(1, num_chapters + 1)} # Create outline dictionary with style
print(f"Processed Outline: {outline_dict}") # Debug statement
agent = create_book_agent(api_key) # Create agent with user-provided API key
return write_book(title, outline_dict) # Call the generator
except Exception as e:
return f"An error occurred: {e}"
generate_button.click(generate_book_interface, inputs=user_input, outputs=output)
demo.launch(share=True) # Enable sharing of the Gradio app
if __name__ == "__main__":
gradio_interface()