Arabic_story_generator / llm_models.py
pain's picture
Upload 6 files
b0359f9 verified
raw
history blame
6.88 kB
import json
from openai import OpenAI
from pydantic import BaseModel
from typing import List
from image_generator import get_image
import gradio as gr
class StepByStepAIResponse(BaseModel):
title: str
story_segments: List[str]
image_prompts: List[str]
class GetTranslation(BaseModel):
translated_text: List[str]
def generate_story(k, prompt, api_key):
"""Generate a story with k segments and initial prompt"""
if api_key == "":
raise gr.Error("Please add your OpenAI API key ")
else:
try:
client = OpenAI(api_key=api_key)
response = client.chat.completions.create(
model="gpt-4-turbo-preview",
messages=[
{
"role": "system",
"content": f"""
Your expertise lies in weaving captivating narratives for children, complemented by images that vividly bring each tale to life. Embark on a creative endeavor to construct a story segmented into {k} distinct chapters, each a cornerstone of an enchanting journey for a young audience.
The input prompt will be on Arabic, but the output must be in English.
**Task Overview**:
1. **Story Development**:
- Craft a narrative divided into {k} parts, with a strict 50-word limit for each.
- Start with an engaging introduction that lays the foundation for the adventure.
- Ensure each part naturally progresses from the previous, crafting a fluid story that escalates to an exhilarating climax.
- Wrap up the narrative with a gratifying conclusion that ties all story threads together.
- Keep character continuity intact across the story, with consistent presence from beginning to end.
- You must describe the characters in details in every image prompt.
- Use language and themes that are child-friendly, imbued with wonder, and easy to visualize.
- The story will talk about {prompt}
2. **Image Generation Instructions for Image Models**:
- For every story part, create a comprehensive prompt for generating an image that encapsulates the scene's essence. Each prompt should:
- Offer a detailed description of the scene, characters, and critical elements, providing enough specificity for the image model to create a consistent and coherent visual.
- Request the images be in an anime style to ensure visual consistency throughout.
- Given the image model's isolated processing, reintroduce characters, settings, and pivotal details in each prompt to maintain narrative and visual continuity.
- Focus on visual storytelling components that enhance the story segments, steering clear of direct text inclusion in the images.
**Key Points**:
- Due to the image model's lack of recall, stress the need for self-contained prompts that reintroduce crucial elements each time. This strategy guarantees that, although generated independently, each image mirrors a continuous and cohesive visual story.
Through your skill in melding textual and visual storytelling, you will breathe life into this magical tale, offering young readers a journey to remember through both prose and illustration.
""",
},
],
functions=[
{
"name": "get_story_segments_and_image_prompts",
"description": "Get user answer in series of segment and image prompts",
"parameters": StepByStepAIResponse.model_json_schema(),
}
],
function_call={
"name": "get_story_segments_and_image_prompts"
}, # Corrected to match the defined function name
temperature=1,
max_tokens=1000,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
output = json.loads(response.choices[0].message.function_call.arguments)
sbs = StepByStepAIResponse(**output)
return sbs
except Exception as error:
print(str(error))
raise gr.Error(
"An error occurred while generating the story. Please try again."
)
def get_Arabic_translation(story_segments, api_key):
if api_key == "":
raise gr.Error("Please add your OpenAI API key ")
else:
try:
client = OpenAI(api_key=api_key)
response = client.chat.completions.create(
model="gpt-4-turbo-preview",
messages=[
{
"role": "system",
"content": f"""
You are an expert translator of text from English to Arabic.
On the following, you can find the input text that you need to translate to Arabic:
{story_segments}
Translate it from English to Arabic.
""",
},
],
functions=[
{
"name": "translate_text_from_english_to_arabic",
"description": "Translate the text from English to Arabic.",
"parameters": GetTranslation.model_json_schema(),
}
],
function_call={
"name": "translate_text_from_english_to_arabic"
}, # Corrected to match the defined function name
temperature=1,
max_tokens=1000,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
output = json.loads(response.choices[0].message.function_call.arguments)
sbs = GetTranslation(**output)
return sbs
except Exception as error:
print(str(error))
raise gr.Error(
"An error occurred while translating the text. Please try again."
)
def get_text_image_pairs(k, prompt, api_key_openai, api_key_stability_ai):
describtion = generate_story(k, prompt, api_key_openai)
segements_translation = get_Arabic_translation(
describtion.story_segments, api_key_openai
)
images_names = [
get_image(itm, api_key_stability_ai) for itm in describtion.image_prompts
]
return (segements_translation.translated_text, images_names)