import streamlit as st from huggingface_hub import InferenceClient from gradio_client import Client import re # Load custom CSS with open('style.css') as f: st.markdown(f'', unsafe_allow_html=True) # Initialize the HuggingFace Inference Client text_client = InferenceClient(model="mistralai/Mistral-7B-Instruct-v0.1") image_client = Client("Boboiazumi/animagine-xl-3.1") def format_prompt_for_description(name, hair_color, personality, outfit_style, hobbies, favorite_food, background_story, **kwargs): prompt = f"Create a waifu character named {name} with {hair_color} hair, a {personality} personality, and wearing a {outfit_style}. " prompt += f"Her hobbies include {hobbies}. Her favorite food is {favorite_food}. Here is her background story: {background_story}." for key, value in kwargs.items(): prompt += f" Her {key} is {value}." return prompt def format_prompt_for_image(name, hair_color, personality, outfit_style, **kwargs): prompt = f"Generate an image prompt for a waifu character named {name} with {hair_color} hair, a {personality} personality, and wearing a {outfit_style}." for key, value in kwargs.items(): prompt += f" She is in a {key} setting, posing in a {value}." return prompt def clean_generated_text(text): # Remove any unwanted trailing tags or characters like clean_text = re.sub(r'$', '', text).strip() return clean_text def generate_text(prompt, temperature=0.9, max_new_tokens=512, top_p=0.95, repetition_penalty=1.0): temperature = max(temperature, 1e-2) generate_kwargs = dict( temperature=temperature, max_new_tokens=max_new_tokens, top_p=top_p, repetition_penalty=repetition_penalty, do_sample=True, seed=42, ) try: stream = text_client.text_generation(prompt, **generate_kwargs, stream=True, details=True, return_full_text=False) output = "" for response in stream: output += response.token.text return clean_generated_text(output) except Exception as e: st.error(f"Error generating text: {e}") return "" def generate_image(prompt): try: result = image_client.predict( prompt=prompt, negative_prompt="", seed=0, custom_width=1024, custom_height=1024, guidance_scale=7.0, num_inference_steps=28, sampler="Euler a", aspect_ratio_selector="896 x 1152", style_selector="(None)", quality_selector="Standard v3.1", use_upscaler=False, upscaler_strength=0.55, upscale_by=1.5, add_quality_tags=True, isImg2Img=False, img_path=None, img2img_strength=0.65, api_name="/run" ) # Process and display the result if result: images = [] for image_data in result[0]: images.append(image_data['image']) return images else: st.error("Unexpected result format from the Gradio API.") return None except Exception as e: st.error(f"Error generating image: {e}") st.write("Full error details:", e) return None def main(): st.title("Free Waifu Character Generator") st.write(""" Welcome to the Free Waifu Character Generator! This app allows you to create a unique waifu with just one click. Generate a detailed bio/background story, a prompt for an image, and the image itself. It's the best free waifu generator out there, providing everything you need to bring your waifu to life. """) # Layout containers left_col, right_col = st.columns(2) with left_col: st.header("Waifu Settings") # Basic settings name = st.text_input("Name of the Waifu") hair_color = st.selectbox("Hair Color", ["Blonde", "Brunette", "Red", "Black", "Blue", "Pink"]) personality = st.selectbox("Personality", ["Tsundere", "Yandere", "Kuudere", "Dandere", "Genki", "Normal"]) outfit_style = st.selectbox("Outfit Style", ["School Uniform", "Maid Outfit", "Casual", "Kimono", "Gothic Lolita"]) # Advanced settings with st.expander("More Options"): hobbies = st.text_input("Hobbies") favorite_food = st.text_input("Favorite Food") background_story = st.text_area("Background Story") eye_color = st.selectbox("Eye Color", ["Blue", "Green", "Brown", "Hazel", "Red", "Purple"], index=0) height = st.text_input("Height (e.g., 5'6\")", "") age = st.text_input("Age", "") favorite_quote = st.text_input("Favorite Quote", "") strengths = st.text_input("Strengths", "") weaknesses = st.text_input("Weaknesses", "") goals = st.text_input("Goals", "") background_setting = st.selectbox("Background Setting", ["School", "City", "Fantasy World", "Beach", "Park"], index=0) pose = st.selectbox("Pose", ["Standing", "Sitting", "Action Pose", "Lying Down"], index=0) system_prompt = st.text_input("Optional System Prompt", "") # Advanced settings sliders with st.expander("Advanced Settings"): temperature = st.slider("Temperature", 0.0, 1.0, 0.9, step=0.05) max_new_tokens = st.slider("Max new tokens", 0, 8192, 512, step=64) top_p = st.slider("Top-p (nucleus sampling)", 0.0, 1.0, 0.95, step=0.05) repetition_penalty = st.slider("Repetition penalty", 1.0, 2.0, 1.0, step=0.05) # Initialize session state for generated text and image prompt if "character_description" not in st.session_state: st.session_state.character_description = "" if "image_prompt" not in st.session_state: st.session_state.image_prompt = "" if "image_paths" not in st.session_state: st.session_state.image_paths = [] # Generate button if st.button("Generate Waifu"): with st.spinner("Generating waifu character..."): description_prompt = format_prompt_for_description( name, hair_color, personality, outfit_style, hobbies, favorite_food, background_story, eye_color=eye_color, height=height, age=age, favorite_quote=favorite_quote, strengths=strengths, weaknesses=weaknesses, goals=goals ) image_prompt = format_prompt_for_image( name, hair_color, personality, outfit_style, background_setting=background_setting, pose=pose ) # Generate character description st.session_state.character_description = generate_text(description_prompt, temperature, max_new_tokens, top_p, repetition_penalty) # Generate image prompt st.session_state.image_prompt = generate_text(image_prompt, temperature, max_new_tokens, top_p, repetition_penalty) # Generate image from image prompt st.session_state.image_paths = generate_image(st.session_state.image_prompt) st.success("Waifu character generated!") with right_col: st.header("Generated Waifu") # Display the generated character and image prompt if st.session_state.character_description: st.subheader("Generated Waifu Character") st.write(st.session_state.character_description) if st.session_state.image_prompt: st.subheader("Image Prompt") st.write(st.session_state.image_prompt) if st.session_state.image_paths: st.subheader("Generated Image") for image_path in st.session_state.image_paths: st.image(image_path, caption="Generated Waifu Image") if __name__ == "__main__": main()