File size: 4,354 Bytes
2066d76
 
 
4deeba7
2066d76
4466d3a
4d5a47b
4466d3a
4d5a47b
4466d3a
 
4d5a47b
 
4466d3a
 
 
 
 
 
 
 
4d5a47b
 
 
 
4466d3a
4d5a47b
 
 
4466d3a
 
2066d76
 
4d5a47b
 
 
 
2066d76
 
 
 
 
 
 
 
 
4d5a47b
 
 
 
 
 
2066d76
 
 
4d5a47b
 
 
 
 
 
 
2066d76
 
 
 
 
 
 
 
 
4d5a47b
 
2066d76
 
 
 
4d5a47b
 
a9cd4d0
4d5a47b
 
2066d76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c2c03f
4466d3a
4d5a47b
 
 
2066d76
 
 
 
4d5a47b
2066d76
 
 
 
 
 
4d5a47b
 
2066d76
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import gradio as gr
import requests

prefix = "https://smartfeed-custom-tools.hf.space/gradio_api/file="

extract_model_tag_list = [
    "o3",
    "o3(poe)",
    "gpt-5",
    "o4-mini(openrouter)",
    "o4-mini-high(openrouter)",
]

extract_model_map = {
    "o3": "o3-2025-04-16",
    "o3(poe)": "o3(poe)",
    "gpt-5": "gpt-5-2025-08-07",
    "o4-mini(openrouter)": "openai/o4-mini",
    "o4-mini-high(openrouter)": "openai/o4-mini-high",
}


def change_image_style(
    image_url,
    style_image_url,
    extract_model_tag,
    extract_prompt,
    prompt_prefix
):
    extract_model = extract_model_map.get(extract_model_tag, "o3")

    data = {
        "image_url": image_url,
        "style_image_url": style_image_url,
        "extract_model": extract_model,
        "extract_prompt": extract_prompt,
        "prompt_prefix": prompt_prefix
    }

    response = requests.post(
        "https://api.hkhappymobile.com/tools/change-image-style",
        json=data,
        headers={"content-type": "application/json"}
    )

    if response.status_code == 200:
        data = response.json().get("data")
        resultImageUrl = data.get("image_url")
        edit_prompt = data.get("edit_prompt")
        # replace \n to <br>
        edit_prompt = edit_prompt.replace("\n", "<br>")
        return resultImageUrl, edit_prompt
    else:
        raise Exception(f"Error: {response.status_code} - {response.text}")

def generate_image(
    input_image,
    style_images,
    extract_model,
    extract_prompt,
    prompt_prefix
):

    if not input_image:
        raise gr.Error(f"Please upload an input image! Refer to step 1️⃣")

    if style_images is None:
        raise gr.Error(f"Cannot find any style image! Please refer to step 1️⃣")

    inputImageUrl = prefix + input_image

    result_images = []
    markdownStr = ""
    for style_image in style_images:
        if not style_image:
            raise gr.Error(f"Cannot find any style image! Please refer to step 1️⃣")
        styleImageUrl = prefix + style_image[0]
        result_image, edit_prompt = change_image_style(inputImageUrl, styleImageUrl, extract_model, extract_prompt, prompt_prefix)
        result_images.append(result_image)
        markdownStr += f"{edit_prompt} <img src='{result_image}' style='zoom: 33%;' />\n"

    return result_images, markdownStr


def swap_to_gallery(images):
    return gr.update(value=images, visible=True), gr.update(visible=True), gr.update(visible=False)

def remove_back_to_files():
    return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)

with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():

            files = gr.File(
                        label="Drag (Select) 1 or more style images",
                        file_types=["image"],
                        file_count="multiple"
                    )
            uploaded_files = gr.Gallery(label="Your images", visible=False, columns=5, rows=1, height=200)
            with gr.Column(visible=False) as clear_button:
                remove_and_reupload = gr.ClearButton(value="Remove and upload new ones", components=files, size="sm")
            input_image = gr.Image(label="Input Image", type="filepath", interactive=True)
            extract_model = gr.Dropdown(choices=extract_model_tag_list, label="Extract Model", value="o3")
            extract_prompt = gr.Textbox(lines=2, label="Extracted Prompt", value="Accurately extract everything from this photo into a prompt especially the hairstyle excluding the backgrounds. I want to replicate it perfectly. need to be a complete paragraph")
            prompt_prefix = gr.Textbox(lines=1, label="Prompt Prefix", value="change the backgrounds to match this:")

            submit = gr.Button("Submit")

        with gr.Column():
            gallery = gr.Gallery(label="Generated Images")
            markdown = gr.Markdown(label="Generated Images")

        files.upload(fn=swap_to_gallery, inputs=files, outputs=[uploaded_files, clear_button, files])
        remove_and_reupload.click(fn=remove_back_to_files, outputs=[uploaded_files, clear_button, files])

        submit.click(
            fn=generate_image,
            inputs=[input_image, uploaded_files, extract_model, extract_prompt, prompt_prefix],
            outputs=[gallery, markdown]
        )

    
demo.launch()