File size: 3,671 Bytes
0d55847
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

from vertexai.preview.vision_models import Image
from vertexai.preview.vision_models import ImageQnAModel

image_qna_model = ImageQnAModel.from_pretrained("imagetext@001")


template = """You are a super smart and charming GPT living inside of a plant, every day you get a text with your status. Your task then is to write a flirty message to your owner.
Status Data:
{question}

Let's think step by step.
Flirty message:
"""

prompt = PromptTemplate(template=template, input_variables=["question"])
llm = ChatOpenAI(model="gpt-4")
llm_chain = LLMChain(prompt=prompt, llm=llm)


def detect_question(image_path, question):
    # Ask a question about the image
    image = Image.load_from_file(image_path)
    return image_qna_model.ask_question(image=image, question=question)[0]


import gradio as gr
import os
import time

# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.

local_history = []
global_cache = {}


def add_text(history, text):
    global global_history, global_message
    history = history + [(text, None)]
    return history, gr.Textbox(value="", interactive=False)


def add_file(history, file):
    history = history + [((file.name,), None)]

    return history


def bot(history):
    global global_cache
    last_msg = history[-1][-0]
    if isinstance(last_msg, tuple):
        last_msg = last_msg[0]

    # check if last message is an existing path
    history[-1][1] = ""
    global_cache["history"] = history
    global_cache["last_msg"] = last_msg

    if os.path.exists(last_msg):
        history[-1][1] += "Detecting image..."
        yield history
        answer = detect_question(
            last_msg,
            "Your task is to save the main plant, classify what kind of plant it is:",
        )
        history[-1][1] = f"Plant detected: {answer}\n"
        yield history
        answer = detect_question(
            last_msg,
            "Where is orange indicator on the moist level on the soil hydrometer? DRY, MOIST or WET?",
        )
        history[-1][1] += f"Hydration level detected: {answer}\n"
        yield history
        answer = detect_question(
            last_msg,
            "Your task is to save the main plant, does it have a visible disease:",
        )
        history[-1][1] += f"Disease detected: {answer}\n"
        yield history
        status = history[-1][1]
        chat = llm_chain.run(status)
        history.append((chat, None))
        yield history
    else:
        history[-1][1] = "Thinking..."


def change_fn(*args, **kwargs):
    global_cache["args"] = args
    # global_history = history
    # return history


with gr.Blocks() as demo:
    chatbot = gr.Chatbot(
        local_history,
        elem_id="chatbot",
        bubble_full_width=False,
    )

    with gr.Row():
        txt = gr.Textbox(
            scale=4,
            show_label=False,
            placeholder="Enter text and press enter, or upload an image",
            container=False,
        )
        btn = gr.UploadButton("📁", file_types=["image", "video", "audio"])

    txt_msg = txt.submit(add_text, [chatbot, txt], [chatbot, txt], queue=False).then(
        bot, chatbot, chatbot, api_name="bot_response"
    )
    txt_msg.then(lambda: gr.Textbox(interactive=True), None, [txt], queue=False)
    file_msg = btn.upload(add_file, [chatbot, btn], [chatbot], queue=False).then(
        bot, chatbot, chatbot
    )

demo.launch(auth=("admin", os.environ["DEMO_KEY"]))