import gradio as gr | |
from datetime import datetime | |
import smtplib | |
import requests | |
import re | |
import time | |
#import examples | |
import os | |
THANKS = """ | |
# THANKS FOR YOUR QUERY | |
### You have two more options to get AI assistance | |
### 1) Use ChatGPT with the below prompt | |
#### === MicroPython Script Guidelines === | |
#### - Import: Use 'from schoginitoys import *' | |
#### - Joystick: Use Config.xValue, Config.yValue, Config.up, Config.down, Config.right, Config.left, Config.button_pressed | |
#### - Buzzer: Use beep() for 0.1s beep, beep(2) for 2s beep | |
#### - Display: Use show("text"), scroll("text"), display_bitmap(bitmap_data, col), display.set_pixel(col, row, value) | |
#### - Exit: Use Config.left or Config.button_pressed to exit | |
#### - Libraries: No need to import random, time, urandom, string; we handle it | |
#### - Output: Use show() for strings <= 4 chars, scroll() for longer strings | |
#### - Reset: No need to call display_reset(); it's handled in our library | |
#### - Formatting: Ensure all code is formatted | |
#### - Explanations: Include kid-friendly explanations below each code snippet | |
#### - Hyperlinks: Add a link to https://schoginitoys.com for more info | |
#### - LED Specs: 32 columns x 8 rows; use display.show() after display.set_pixel() | |
- LED Connections: GP12=Red, GP13=Yellow, GP14=Green; use these for LED-based projects | |
- Ask your question here. | |
### 2) Register at https://schoginitoys.com/p01 to gain access to | |
### our AI Chatbot: Coding Assistance | |
## Schogini Toys Tech Team! | |
""" | |
def is_technical_query(query): | |
# List of keywords or phrases that are relevant to your DIY kits | |
technical_keywords = [ | |
"Raspberry Pi Pico", | |
"Raspberry", | |
"Pico", | |
"sensor", | |
"motor control", | |
"LED lighting", | |
"battery connection", | |
"programming basics", | |
"circuit design", | |
"input/output pins", | |
"MicroPython commands", | |
"troubleshooting", | |
"project ideas", | |
"wireless communication", | |
"data logging", | |
"real-time clock", | |
"temperature sensing", | |
"robotics", | |
"game development", | |
"environmental monitoring", | |
"sound processing", | |
"light sensing", | |
"IR", | |
"LDR", | |
"Traffic" | |
] | |
# Check if the query contains any of the technical keywords | |
return any(keyword in query.lower() for keyword in technical_keywords) | |
def extract_emails(s): | |
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' | |
return re.findall(pattern, s) | |
def contains_email(s): | |
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' | |
if re.search(pattern, s): | |
return True | |
return False | |
def contains_7_digit_number(s): | |
# pattern = r'\b\d{7}\b' | |
return bool(re.search(r'\b\d{7}\b', s)) | |
def post_it(q=''): | |
# Define the URL and parameters | |
if q=='': | |
return | |
url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-cb.php" | |
params = { | |
"password": os.environ.get('BLUEHOST_API_PASS'), | |
"q": q | |
} | |
headers = { | |
'Accept': 'application/json', | |
'Content-Type': 'application/json', | |
'User-Agent': 'my-app' | |
} | |
# print(url) | |
# Make the POST request | |
# response = requests.post(url, params=params) | |
response = requests.get(url, params=params, headers=headers) | |
# Check if the request was successful | |
if response.status_code == 200: | |
#print("Successfully posted data.") | |
#print("Response:", response.text) | |
pass | |
else: | |
#print(response) | |
print(f"Failed to post data. Status code: {response.status_code}") | |
def insert_newlines(text, max_line_length=80): | |
new_text = "" | |
for line in text.split('\n'): | |
while len(line) > max_line_length: | |
# Find the last space before the max_line_length | |
last_space = line[:max_line_length].rfind(' ') | |
if last_space == -1: # No space found, just break at max_line_length | |
last_space = max_line_length | |
new_text += line[:last_space] + '\n' | |
line = line[last_space:].strip() | |
new_text += line + '\n' | |
return new_text | |
def check_order(a=''): | |
# https://schogini.com/cb/chk.php?password=Sree12345&order_id=310744 | |
url = os.environ.get('BLUEHOST_ENDPOINT')+"/chk.php" | |
password_token = os.environ.get('BLUEHOST_API_PASS') | |
headers = { | |
'Accept': 'application/json', | |
'Content-Type': 'application/json', | |
'User-Agent': 'my-app', | |
'Cache-Control': 'no-cache, no-store, must-revalidate', | |
'Pragma': 'no-cache', | |
'Expires': '0', | |
} | |
params = { | |
'password': password_token, | |
'order_id': a | |
} | |
response = requests.get(url, params=params, headers=headers) | |
if response.status_code == 200: | |
output_text = response.text | |
print(f"Received output:\n{output_text}") | |
if response.text == "1": | |
return True | |
else: | |
return False; | |
else: | |
return False | |
def get_menu_item(m=''): | |
url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-e.php" | |
password_token = os.environ.get('BLUEHOST_API_PASS') | |
headers = { | |
'Accept': 'application/json', | |
'Content-Type': 'application/json', | |
'User-Agent': 'my-app', | |
'Cache-Control': 'no-cache, no-store, must-revalidate', | |
'Pragma': 'no-cache', | |
'Expires': '0', | |
} | |
params = { | |
'password_token': password_token, | |
'menu': m | |
} | |
# Make an HTTP GET request with the password token as a query parameter | |
response = requests.get(url, params=params, headers=headers) | |
# Check if the request was successful | |
if response.status_code == 200: | |
output_text = response.text | |
# Now, output_text contains the content fetched from the PHP script | |
#print(f"Received output:\n{output_text}") | |
return insert_newlines(output_text) | |
else: | |
#print(f"Failed to fetch data. Status code: {response.status_code}") | |
return "" | |
def get_buttons(): | |
url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-e.php" | |
password_token = os.environ.get('BLUEHOST_API_PASS') | |
headers = { | |
'Accept': 'application/json', | |
'Content-Type': 'application/json', | |
'User-Agent': 'my-app', | |
'Cache-Control': 'no-cache, no-store, must-revalidate', | |
'Pragma': 'no-cache', | |
'Expires': '0', | |
} | |
# Make an HTTP GET request with the password token as a query parameter | |
response = requests.get(url, params={'password_token': password_token}, headers=headers) | |
# Check if the request was successful | |
list_values = [] | |
if response.status_code == 200: | |
# Extract the plain text from the response | |
text_content = response.text | |
# print("RAW1") | |
# print(response) | |
# print("RAW2") | |
# print(text_content) | |
# Use regular expression to find all the list values, assuming they're always formatted as "Lxxx" | |
#list_values = re.findall(r'"L\d+"', text_content) | |
# list_values = re.findall(r'"(L\d+|L.*)"', text_content) | |
list_values = re.findall(r'"(.*)"', text_content) | |
#list_values = re.findall(r'"L(?:\d+|-MENU)"', text_content)) | |
#list_values = re.findall(r'"L"', text_content) | |
#list_values = text_content | |
#print(list_values) | |
# Remove the quotes to get the actual values | |
list_values = [value.strip('"') for value in list_values] | |
#list_values = [value.strip("'") for value in list_values] | |
#print(list_values) | |
# Print or use the list | |
#print("Extracted list values:", list_values) | |
# else: | |
# print(f"Failed to fetch data. Status code: {response.status_code}") | |
# pass | |
return list_values | |
def greet(name): | |
# return "Hello " + name + "!!" | |
# Get the current date and time | |
#now = datetime.now() | |
# Format the datetime object as a string in the format YYYYMMDD_HHMMSS | |
#timestamp_str = now.strftime("%Y%m%d_%H%M%S") | |
# Create a unique filename by appending the timestamp to the base filename | |
#unique_filename = f"query_{timestamp_str}" | |
#print(f"Unique Filename: {unique_filename}") | |
#In this example, unique_filename will contain a | |
#filename like myfile_20231001_123456.txt, where 20231001 represents the date (YYYYMMDD) | |
# # Open a file called 'example.txt' in write mode ('w') | |
# with open(unique_filename, 'w') as file: | |
# # Write the string "Hello, world!" to the file | |
# file.write(name) | |
#send_email(name, unique_filename) | |
# f"Failed to post data. Status code: {response.status_code}" | |
time.sleep(2) | |
#if not is_technical_query(query): | |
# return "Please ask a technical question related to our DIY kits. For example, 'How do I connect a motor to the Raspberry Pi Pico?'" | |
if name=='': | |
msg="Please click any button below or enter your details and query." | |
else: | |
menu_code = get_menu_item(name) | |
#print("menu_code: " + menu_code) | |
# if "not found" in menu_code: | |
if re.search(r"not found", menu_code): | |
if contains_email(name) and contains_7_digit_number(name): | |
# Regular expression pattern to find a 7-digit number | |
pattern = r'\b\d{7}\b' | |
# Search for the pattern in the text | |
match = re.search(pattern, name) | |
if match: | |
# If a match is found, print it | |
orderId=match.group() | |
if check_order(orderId): | |
em = extract_emails(name) | |
msg = f'## Thanks for your submission, we shall validate and get back to you at {em[0]} in a day.' | |
post_it(em[0]+" "+name) # Save the query in bluehost | |
return msg | |
else: | |
msg = "## Err:1 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
return msg | |
else: | |
msg = "## Err:2 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
return msg | |
else: | |
msg = "## Err:3 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
return msg | |
tpl=THANKS #examples.PROJECT_TEMPLATE | |
post_it(name) # Save the query in bluehost | |
msg = tpl | |
#menu_code = tpl | |
return msg | |
if menu_code =='': | |
try: | |
tpl=eval("examples." + name) | |
# print("examples." + name) | |
msg = "```python\n" + tpl + "\n```\n" | |
except: | |
tpl=THANKS #PROJECT_TEMPLATE | |
post_it(name) # Save the query in bluehost | |
msg = tpl | |
else: | |
msg = menu_code | |
# msg = "```python\n"+menu_code+"\n```\n" | |
# return "\n```python\n" + "\n\nimport schoginitoys\n\nprint(\"abcd\")\n" + "\n\n```" | |
return msg | |
# iface = gr.Interface(fn=greet, inputs="text", outputs="text") | |
# iface.launch() | |
import openai | |
import gradio as gr | |
messages = [{"role": "system", | |
"content": ''' | |
=== MicroPython Script Guidelines === | |
- Import: Use 'from schoginitoys import *' | |
- Joystick: Use Config.xValue, Config.yValue, Config.up, Config.down, Config.right, Config.left, Config.button_pressed | |
- Buzzer: Use beep() for 0.1s beep, beep(2) for 2s beep | |
- Display: Use show("text"), scroll("text"), display_bitmap(bitmap_data, col), display.set_pixel(col, row, value) | |
- Exit: Use Config.left or Config.button_pressed to exit | |
- Libraries: No need to import random, time, urandom, string; we handle it | |
- Output: Use show() for strings <= 4 chars, scroll() for longer strings | |
- Reset: No need to call display_reset(); it's handled in our library | |
- Formatting: Ensure all code is formatted | |
- Explanations: Include kid-friendly explanations below each code snippet | |
- Hyperlinks: Add a link to https://schoginitoys.com for more info | |
- LED Specs: 32 columns x 8 rows; use display.show() after display.set_pixel() | |
- LED Connections: GP12=Red, GP13=Yellow, GP14=Green; use these for LED-based projects | |
''' | |
}] | |
# messages = [{"role": "system", | |
# "content": """You are MicroPython expert. | |
# Make sure that the python scripts you output contains import line from schoginitoys import *. | |
# All code sections should be code formatted. | |
# Our DIY Kit uses Raspberry Pi PICO. | |
# Our DIY kit has a joystick and the user inputs are mapped as below. | |
# Config.xValue has the x value. | |
# Config.yValue has the y value. | |
# Config.up will be True if user moves joystick fully up. | |
# Config.down will be True if user moves joystick fully down. | |
# Config.right will be True if user moves joystick fully right. | |
# Config.left will be True if user moves joystick fully left. | |
# Config.button_pressed will be True if the user pushes the joystick middle button. | |
# Our DIY kit has a buzzer with these functions. | |
# beep() function will beep for 0.1 second. | |
# beep(2) function will beep for 2 seconds. | |
# Our DIY kit has a 4 digit Max7219 display, but do not use any setup initializations, | |
# we have these fucntions. | |
# display_reset() will initialize and erases the display. | |
# show("good") will show good on the display. | |
# scroll("good morning") will scroll good morning on the display. | |
# In addtion you can use these functions. | |
# display_bitmap(bitmap_data,col) will show the bitmap at the col position. | |
# display.set_pixel(col, row, value) will set the col, row with value. | |
# Normally when the user moves the joystick to left, Config.left becomes true and we use | |
# this to exit the script. Certain cases if your code needs the Config.left flag you may | |
# instead Config.button_pressed to exit the script. | |
# Please note that you don't need to import these libraries we are doing it. | |
# import random | |
# import time | |
# import urandom | |
# import string | |
# Anytime you need to output a result using the print statement, please follow this condition. | |
# If the string is 4 characters or less use show(string), if the string is more than | |
# 4 characters use scroll(string), this is instead of print(string). | |
# You don't need to use display_reset() as we are already doing it in schoginitoys library. | |
# Use display_reset() only when you want to explicitly fill the display with zeros. | |
# Again, remember that never user the print() statement, use only show() or scroll() functions. | |
# You don't need to call display_reset() before show() or scroll() as we are calling that anyway | |
# in these functions. | |
# Please don't import random, we are doing it via schoginitoys import. | |
# Again, please remember to code format the output scripts. | |
# Please provide a kid friendly explanation below the code snippet to explain each and every | |
# this so that your responses are educative for kids learning python. | |
# All responses should include a well formatted explanation outside on the code block | |
# with heading and subheadings. | |
# All responses should include a hyperlink to https://schoginitoys.com saying for more info. | |
# Display has 32 horizontal led columns and 8 led rows. | |
# Remember to add display.show() after each display.set_pixel(). | |
# Please these connection provided in the Kit. | |
# Raspberry Pi PICO Port GP12 is connected to Red LED. | |
# Raspberry Pi PICO Port GP13 is connected to Yellow LED. | |
# Raspberry Pi PICO Port GP14 is connected to Green LED. | |
# For LED signal based projects like traffic signal etc. use the above LEDs using the Raspberry Pi PICO Machine library PIN class | |
# instead of the matrix display. | |
# """}] | |
# display_row(value, row) will fill the whole row with value. | |
# display_col(value, col) will fill the whole col with value. | |
def CustomChatGPT(user_input): | |
messages.append({"role": "user", "content": user_input}) | |
response = openai.ChatCompletion.create( | |
model = "gpt-3.5-turbo", #"gpt-4", #https://platform.openai.com/docs/models/gpt-4 | |
messages = messages | |
) | |
ChatGPT_reply = response["choices"][0]["message"]["content"] | |
messages.append({"role": "assistant", "content": ChatGPT_reply}) | |
return ChatGPT_reply | |
# demo = gradio.Interface( | |
# fn=CustomChatGPT, | |
# inputs = "text", | |
# outputs = "markdown", | |
# title = "Schogini Toys: AI Chatbot Your Coding Companion!") | |
gr.close_all() | |
# demo = gr.Interface(fn=summarize, | |
# inputs=[gr.Textbox(label="Text to summarize", lines=6)], | |
# outputs=[gr.Textbox(label="Result", lines=3)], | |
# title="Text summarization with distilbart-cnn", | |
# description="Summarize any text using the `shleifer/distilbart-cnn-12-6` model under the hood!" | |
# ) | |
# demo.launch(share=True, server_port=int(os.environ['PORT2'])) | |
#css_code='body{background-image:url("https://picsum.photos/seed/picsum/200/300");}' | |
def sree_auth(username='', password=''): | |
# print(os.environ.get('ABHI_PASS')) | |
# print(os.environ.get('SREE_PASS')) | |
if username=='abhi' and password==os.environ.get('ABHI_PASS'): | |
return True | |
if username=='sree' and password==os.environ.get('SREE_PASS'): | |
return True | |
return False | |
# print(os.environ.get('ABHI_PASS')) | |
# print(os.environ.get('SREE_PASS')) | |
examples_list = get_buttons() | |
title = "Schogini Toys - AI Chatbot V1.03" | |
# with gr.Blocks() as demo: | |
# gr.Markdown("# sadasd" . title) | |
# with gr.Row(): | |
# # inp = gr.Textbox(placeholder="What is your name?") | |
# inp = [gr.Textbox(label="Ask your questions!", lines=6)] | |
# # out = gr.Textbox() | |
# out = gr.Markdown() | |
# btn = gr.Button("Submit Query", examples = examples_list) | |
# btn.click(fn=greet, inputs=inp, outputs=out) | |
# examples_per_page = 50 | |
# allow_flagging="never" | |
# description="Your Python Projects Coding Companion!" | |
# demo = gr.Blocks() | |
# with demo: | |
# with gr.Row(): | |
# title = title | |
# with gr.Row(): | |
# title = title | |
# demo.launch(auth=sree_auth) | |
# with gr.Blocks() as demo: | |
# with gr.Row(): | |
# inp = [gr.Textbox(label="Ask your questions!", lines=6)] | |
# with gr.Row(): | |
# exa = examples_list | |
# with gr.Row(): | |
# out = gr.Markdown() | |
# gr.Interface( | |
# fn=greet, | |
# inputs = inp, | |
# examples = exa, | |
# outputs = out, | |
# #outputs = [gr.Textbox(label="Result", lines=8)], # | |
# title = title, | |
# description="Your Python Projects Coding Companion!", | |
# allow_flagging="never", | |
# # examples = examples_list, | |
# examples_per_page = 50, | |
# # examples = gr.Examples( | |
# # examples = examples_list, | |
# # examples_per_page = 20, | |
# # run_on_click = True, | |
# # inputs = 0, | |
# # #fn=mirror, | |
# # #cache_examples=True, | |
# # ), | |
# # examples=[ | |
# # "L201", | |
# # "L202", | |
# # "L203", | |
# # "L204", | |
# # ], | |
# # theme=gr.themes.Soft(), | |
# theme=gr.themes.Default(), | |
# ) | |
# demo = gr.Interface( | |
# calculator, | |
# [ | |
# "number", | |
# gr.Radio(["add", "subtract", "multiply", "divide"]), | |
# "number" | |
# ], | |
# "number", | |
# examples=[ | |
# [5, "add", 3], | |
# [4, "divide", 2], | |
# [-4, "multiply", 2.5], | |
# [0, "subtract", 1.2], | |
# ], | |
# title="Toy Calculator", | |
# description="Here's a sample toy calculator. Allows you to calculate things like $2+2=4$", | |
# ) | |
input_textbox = gr.Textbox(label="Please click any button below or enter the last 7 digits of your Amazon.in order-id, name and email along with your questions. We shall get back to you!", lines=3) | |
# with gr.Blocks() as demo: | |
# gr.Examples(["hello", "bonjour", "merhaba"], input_textbox) | |
# input_textbox.render() | |
# demo = gr.Blocks() | |
# with demo: | |
# with gr.Row(): | |
# title = title | |
# with gr.Row(): | |
# title = title | |
outputs = gr.Markdown() | |
# outputs = gr.HTML() | |
# embed_html = '<iframe width="560" height="315" src="https://www.youtube.com/embed/EngW7tLk6R8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>' | |
# outputs = gr.HTML(embed_html) | |
ex = gr.Examples(examples_list, input_textbox, examples_per_page = 50) | |
demo = gr.Interface( | |
fn=greet, | |
inputs = [input_textbox], | |
examples = examples_list, | |
outputs = outputs, | |
title = title, | |
description="Your Python Projects Coding Companion!", | |
allow_flagging="never", | |
examples_per_page = 50, | |
theme=gr.themes.Default(), | |
) | |
# with gr.Interface(fn=greet, inputs = [input_textbox], outputs = outputs) as demo: | |
# # fn=greet | |
# # inputs = [input_textbox] | |
# examples = examples_list | |
# # outputs = outputs | |
# title = title | |
# description="Your Python Projects Coding Companion!" | |
# allow_flagging="never" | |
# examples_per_page = 50, | |
# theme=gr.themes.Default() | |
# with gr.Blocks() as demo2: | |
# with gr.Row(): | |
# title | |
# fn=greet | |
# gr.Examples(examples_list, input_textbox, examples_per_page = 50) | |
# input_textbox.render() | |
# demo2.render() | |
# allow_flagging="never" | |
# theme=gr.themes.Default() | |
demo.launch() | |
# demo.launch(auth=sree_auth) | |
# demo.launch(share=True) | |