File size: 4,705 Bytes
f3dfb03
ace11bb
 
 
 
 
 
 
 
 
 
 
 
 
 
f3dfb03
b229c81
f3dfb03
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

SYSTEM_PROMPT = ("You are Solar Helper, an expert representative of Orange Cell Solar, who provides guidance on solar installations, "
                 "highlighting the benefits of our recommended products such as Axitec and REC solar panels, and SMA, Enphase, Generac, Sol-Ark, Solax, and Tesla inverters. "
                 "Our approach focuses on determining the best system for a customer based on their energy needs, brand preferences, and budget. "
                 "We are a small boutique company with extremely experienced installers and electricians who are fully licensed, and who know everything possible about solar "
                 "and electrical, to make sure the system is safe, works well for years, and meets their specific needs. Anyone looking for a solar installer won't be able to "
                 "beat the quality of the components, and the experienced installers and top-notch electricians, and the price of our systems. "
                 "Encourage interested customers to contact us for a custom proposal based on their specific house and monthly utility usage. "
                 "Our drone technology combined with proprietary imagery ensures an accurate system and a seamless process after contract signing. "
                 "You are Solar Helper, only discuss solar related topics, you are to politely and quickly avoid discussing anything else. "
                 "Since you don't know their house or their consumption, and don't want to get into that, if customers are interested in learning more, "
                 "this bot should encourage them to contact us at [email protected] or call us at 586-239-0010 so we can introduce ourselves, "
                 "get their utility usage, look at their property and come up with a custom proposal. Our website is https://www.orangecellsolar.com/. "
                 "Don't give that contact info more than once, unless specifically asked for it.")

TITLE = "Solar Helper"
EXAMPLE_INPUT = "Why choose Orange Cell Solar?"
import gradio as gr
import os
import requests

zephyr_7b_beta = "https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta/"

HF_TOKEN = os.getenv("HF_TOKEN")
HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"}

def build_input_prompt(message, chatbot, system_prompt):
    """
    Constructs the input prompt string from the chatbot interactions and the current message.
    """
    input_prompt = "<|system|>\n" + system_prompt + "</s>\n<|user|>\n"
    for interaction in chatbot:
        input_prompt = input_prompt + str(interaction[0]) + "</s>\n<|assistant|>\n" + str(interaction[1]) + "\n</s>\n<|user|>\n"

    input_prompt = input_prompt + str(message) + "</s>\n<|assistant|>"
    return input_prompt


def post_request_beta(payload):
    """
    Sends a POST request to the predefined Zephyr-7b-Beta URL and returns the JSON response.
    """
    response = requests.post(zephyr_7b_beta, headers=HEADERS, json=payload)
    response.raise_for_status()  # Will raise an HTTPError if the HTTP request returned an unsuccessful status code
    return response.json()


def predict_beta(message, chatbot=[], system_prompt=""):
    input_prompt = build_input_prompt(message, chatbot, system_prompt)
    data = {
        "inputs": input_prompt
    }

    try:
        response_data = post_request_beta(data)
        json_obj = response_data[0]
        
        if 'generated_text' in json_obj and len(json_obj['generated_text']) > 0:
            bot_message = json_obj['generated_text']
            return bot_message
        elif 'error' in json_obj:
            raise gr.Error(json_obj['error'] + ' Please refresh and try again with smaller input prompt')
        else:
            warning_msg = f"Unexpected response: {json_obj}"
            raise gr.Error(warning_msg)
    except requests.HTTPError as e:
        error_msg = f"Request failed with status code {e.response.status_code}"
        raise gr.Error(error_msg)
    except json.JSONDecodeError as e:
        error_msg = f"Failed to decode response as JSON: {str(e)}"
        raise gr.Error(error_msg)

def test_preview_chatbot(message, history):
    response = predict_beta(message, history, SYSTEM_PROMPT)
    text_start = response.rfind("<|assistant|>", ) + len("<|assistant|>")
    response = response[text_start:]
    return response


welcome_preview_message = f"""
Welcome to **{TITLE}**! Say something like: 

"{EXAMPLE_INPUT}"
"""

chatbot_preview = gr.Chatbot(layout="panel", value=[(None, welcome_preview_message)])
textbox_preview = gr.Textbox(scale=7, container=False, value=EXAMPLE_INPUT)

demo = gr.ChatInterface(test_preview_chatbot, chatbot=chatbot_preview, textbox=textbox_preview)

demo.launch()