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 = '' # 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)