File size: 3,238 Bytes
c54c38e
 
957293d
42390f7
66d8dc1
957293d
 
66d8dc1
11c7c05
db8f193
957293d
 
 
 
 
29d2150
bde77a1
 
c54c38e
 
bde77a1
 
d8958cb
11c7c05
bde77a1
 
 
 
 
c54c38e
 
bde77a1
 
29d2150
bde77a1
 
c54c38e
bde77a1
11c7c05
 
29d2150
 
11c7c05
 
 
 
 
29d2150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42390f7
 
 
 
 
7702794
29d2150
7702794
29d2150
 
11c7c05
 
bde77a1
c54c38e
 
 
bde77a1
 
 
 
 
 
 
 
11c7c05
 
 
29d2150
11c7c05
 
bde77a1
 
 
 
 
 
 
 
 
 
 
 
 
 
c54c38e
11c7c05
 
 
 
 
 
 
c54c38e
 
 
 
 
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
import gradio as gr

from llama_cpp import Llama

llm = Llama.from_pretrained(
    repo_id="ID2223JR/gguf_model",
    filename="unsloth.Q4_K_M.gguf",
)


# llm = Llama.from_pretrained(
#    repo_id="ID2223JR/gguf_model_q8",
#    filename="unsloth.Q8_0.gguf",
# )


# Data storage
ingredients_list = []


# Function to add ingredient
def add_ingredient(ingredient, quantity):
    if ingredient and quantity > 0:
        ingredients_list.append(f"{ingredient}, {quantity} grams")
    return (
        "\n".join(ingredients_list),
        gr.update(value="", interactive=True),
        gr.update(value=None, interactive=True),
    )


# Function to enable/disable add button
def validate_inputs(ingredient, quantity):
    if ingredient and quantity is not None and quantity > 0:
        return gr.update(interactive=True)
    return gr.update(interactive=False)


def submit_to_model():
    if not ingredients_list:
        yield "Ingredients list is empty! Please add ingredients first."
        return

    prompt = f"Using the following ingredients, suggest a recipe:\n\n" + "\n".join(
        ingredients_list
    )

    try:
        response = llm.create_chat_completion(
            messages=[
                {
                    "role": "system",
                    "content": (
                        "You are a world-renowned chef, celebrated for your expertise..."
                    ),
                },
                {"role": "user", "content": prompt},
            ],
            stream=True,  # Enable streaming
        )

        content = ""

        for partial_response in response:

            content += partial_response["choices"][0]["delta"].get("content", "")

            if content:
                yield content

        ingredients_list.clear()  # Reset list after generation

    except Exception as e:
        yield f"An error occurred: {str(e)}"


# App
def app():
    with gr.Blocks() as demo:
        with gr.Row():
            ingredient_input = gr.Textbox(
                label="Ingredient", placeholder="Enter ingredient name"
            )
            quantity_input = gr.Number(label="Quantity (grams)", value=None)

        add_button = gr.Button("Add Ingredient", interactive=False)
        output = gr.Textbox(label="Ingredients List", lines=10, interactive=False)

        with gr.Row():
            submit_button = gr.Button("Submit")
            model_output = gr.Textbox(
                label="Recipe Suggestion", lines=25, interactive=False
            )

        # Validate inputs
        ingredient_input.change(
            validate_inputs, [ingredient_input, quantity_input], add_button
        )
        quantity_input.change(
            validate_inputs, [ingredient_input, quantity_input], add_button
        )

        # Add ingredient logic
        add_button.click(
            add_ingredient,
            [ingredient_input, quantity_input],
            [output, ingredient_input, quantity_input],
        )

        # Submit to model logic
        submit_button.click(
            submit_to_model,
            inputs=None,  # No inputs required as it uses the global ingredients_list
            outputs=model_output,
        )

    return demo


demo = app()
demo.launch()