Spaces:
Runtime error
Runtime error
Download app.py from Balibata/ShortNovelGenerator: direct link, hf CLI and curl.
- Browser
- Download file 8.52 kB
-
https://huggingface.co/spaces/Balibata/ShortNovelGenerator/resolve/main/app.py
- Command line
-
hf download hf://spaces/Balibata/ShortNovelGenerator/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Balibata/ShortNovelGenerator/resolve/main/app.py
8.52 kB
| import openai | |
| import gradio as gr | |
| openai.api_key = "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" # Replace with your OpenAI API key | |
| def generate_description(*args): | |
| labels = [ | |
| "World Type", | |
| "Time Period", | |
| "Location", | |
| "Historical Context", | |
| "Cultural Atmosphere", | |
| "Major Conflict", | |
| "Plot Development", | |
| "Resolution", | |
| "Central Themes", | |
| "Tone and Style", | |
| "Character Identity", | |
| "Character Personal Experience", | |
| "Character Relationships", | |
| "Character Status", | |
| "Character Motivations", | |
| "Importance of Historical Accuracy", | |
| "Inspirations for the Story" | |
| ] | |
| prompt_parts = [] | |
| for label, value in zip(labels, args): | |
| if value: # Check if the input is provided | |
| prompt_parts.append(f"{label}: {value}") | |
| if not prompt_parts: # If no input is provided | |
| return "Please provide at least one detail to generate a description." | |
| prompt = "\n".join(prompt_parts) + "\n\nGenerate a descriptive paragraph:" | |
| response = openai.Completion.create(model='text-davinci-003', prompt=prompt, max_tokens=300) | |
| return response.choices[0].text if response.choices else "Error in description generation." | |
| def iterative_refinement(initial_text): | |
| refined_text = initial_text | |
| for _ in range(3): # You can adjust the number of iterations | |
| prompt = refined_text + "\n\nExpand and elaborate on this narrative:" | |
| response = openai.Completion.create( | |
| model='text-davinci-003', | |
| prompt=prompt, | |
| max_tokens=500, | |
| temperature=0.8 | |
| ) | |
| refined_text += "\n\n" + response.choices[0].text if response.choices else "" | |
| return refined_text | |
| def combine_and_refine_descriptions(*args): | |
| combined_text = "\n\n".join(args) | |
| return iterative_refinement(combined_text) if combined_text.strip() else "No content to combine." | |
| def simple_string_matching(extracted, user_input): | |
| # Simple word-based matching, can be replaced with more complex algorithms | |
| matches = sum(1 for word in extracted.split() if word in user_input.split()) | |
| total_words = len(user_input.split()) | |
| return matches / total_words if total_words > 0 else 0 | |
| def evaluate_fiction_accuracy(generated_fiction, world_type, time_period, location, historical_context, | |
| cultural_atmosphere): | |
| # Placeholder for user inputs as a list | |
| user_inputs = [world_type, time_period, location, historical_context, cultural_atmosphere] | |
| # Split generated fiction into words for simple matching | |
| fiction_words = set(generated_fiction.lower().split()) | |
| # Calculate matches for each input | |
| matches = {label: int(any(word in fiction_words for word in input_text.lower().split())) | |
| for label, input_text in | |
| zip(["World Type", "Time Period", "Location", "Historical Context", "Cultural Atmosphere"], user_inputs)} | |
| # Calculate overall similarity score (basic version) | |
| total = len(matches) | |
| score = sum(matches.values()) / total if total > 0 else 0 | |
| return score * 100, matches # Convert to percentage and return matches | |
| with gr.Blocks() as demo: | |
| with gr.Tab("Background"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| world_type = gr.Textbox(label="What kind of world is it?") | |
| time_period = gr.Textbox(label="Time Period") | |
| location = gr.Textbox(label="Location") | |
| historical_context = gr.Textbox(label="Historical Context") | |
| cultural_atmosphere = gr.Textbox(label="Cultural Atmosphere") | |
| background_btn = gr.Button("Generate Background Description") | |
| with gr.Column(): | |
| background_output = gr.Textbox(label="Background Description", lines=18) | |
| background_btn.click(generate_description, | |
| inputs=[world_type, time_period, location, historical_context, | |
| cultural_atmosphere], outputs=background_output) | |
| with gr.Tab("Characters"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| char_identity = gr.Textbox(label="Character Identity (male/female, job, ability)") | |
| char_experience = gr.Textbox(label="Character Personal Experience, Special Character Design") | |
| char_relationships = gr.Textbox(label="Character Relationships with Other Characters") | |
| char_status = gr.Dropdown(label="Character Status in Story", choices=["Main", "Secondary", "NPC"]) | |
| char_motivations = gr.Textbox(label="Character Motivations") | |
| char_btn = gr.Button("Generate Character Description") | |
| with gr.Column(): | |
| char_output = gr.Textbox(label="Character Description", lines=18) | |
| char_btn.click(generate_description, | |
| inputs=[char_identity, char_experience, char_relationships, char_status, | |
| char_motivations], outputs=char_output) | |
| with gr.Tab("Plot"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| major_conflict = gr.Textbox(label="Major Conflict") | |
| plot_development = gr.Textbox(label="Plot Development") | |
| resolution = gr.Textbox(label="Resolution") | |
| plot_btn = gr.Button("Generate Plot Description") | |
| with gr.Column(): | |
| plot_output = gr.Textbox(label="Plot Description", lines=18) | |
| plot_btn.click(generate_description, inputs=[major_conflict, plot_development, resolution], | |
| outputs=plot_output) | |
| with gr.Tab("Themes and Messages"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| central_themes = gr.Textbox(label="Central Themes") | |
| tone_style = gr.Textbox(label="Tone and Style") | |
| themes_btn = gr.Button("Generate Themes Description") | |
| with gr.Column(): | |
| themes_output = gr.Textbox(label="Themes Description", lines=18) | |
| themes_btn.click(generate_description, inputs=[central_themes, tone_style], outputs=themes_output) | |
| with gr.Tab("Additional Details"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| historical_accuracy = gr.Textbox(label="Importance of Historical Accuracy") | |
| inspirations = gr.Textbox(label="Inspirations for the Story") | |
| additional_btn = gr.Button("Generate Additional Details Description") | |
| with gr.Column(): | |
| additional_output = gr.Textbox(label="Additional Details Description", lines=18) | |
| additional_btn.click(generate_description, inputs=[historical_accuracy, inspirations], | |
| outputs=additional_output) | |
| with gr.Tab("Complete Fiction"): | |
| refine_btn = gr.Button("Generate Refined Fiction") | |
| refined_output = gr.Textbox(label="Refined Fiction", lines=40) | |
| refine_btn.click( | |
| combine_and_refine_descriptions, | |
| inputs=[ | |
| background_output, | |
| char_output, | |
| plot_output, | |
| themes_output, | |
| additional_output | |
| ], | |
| outputs=refined_output | |
| ) | |
| with gr.Row(): | |
| fiction_input = gr.Textbox(label="Generated Fiction", lines=40) | |
| world_type_input = gr.Textbox(label="World Type") | |
| time_period_input = gr.Textbox(label="Time Period") | |
| location_input = gr.Textbox(label="Location") | |
| historical_context_input = gr.Textbox(label="Historical Context") | |
| cultural_atmosphere_input = gr.Textbox(label="Cultural Atmosphere") | |
| evaluation_output = gr.Number(label="Similarity Score (%)") | |
| matches_output = gr.Label(label="Matches Found") | |
| evaluate_btn = gr.Button("Evaluate Fiction Accuracy") | |
| evaluate_btn.click( | |
| evaluate_fiction_accuracy, | |
| inputs=[ | |
| fiction_input, | |
| world_type_input, | |
| time_period_input, | |
| location_input, | |
| historical_context_input, | |
| cultural_atmosphere_input | |
| ], | |
| outputs=[evaluation_output, matches_output] | |
| ) | |
| # Launch the Gradio interface | |
| demo.launch(share=True) |