import gradio as gr
import psutil
import subprocess
import time
#placeholders for api use
def generate_response_by_api(user_message):
FinalOutput = ""
#return FinalOutput
pass
def custom_generate_response_by_api(cust_user_message, prompt_index, prompts_list):
prompt, ending = prompts_list[prompt_index] # Unpack the prompt and its ending from the provided list
cust_user_message = f"{prompt}\n\n{cust_user_message}\n\n{ending}"
#return generate_response(cust_user_message)
pass
#-----------------------------------------------------------------------------------------------------------------------
#Local gguf model using llama.cpp
def generate_response(user_message): #generate_response_token_by_token
cmd = [
"/app/llama.cpp/main", # Path to the executable
"-m", "/app/llama.cpp/models/stablelm-2-zephyr-1_6b-Q4_0.gguf",
"-p", user_message,
"-n", "400",
"-e"
]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
process_monitor = psutil.Process(process.pid)
start_time = time.time()
monitor_start_time = time.time()
alltokens = ""
token_buffer = ''
tokencount = 0
try:
while True:
# Read one character at a time
char = process.stdout.read(1)
if char == '' and process.poll() is not None:
break
if char != '':
token_buffer += char
if char == ' ' or char == '\n': # Token delimiters
elapsed_time = time.time() - start_time # Calculate elapsed time
alltokens += token_buffer
tokencount += 1
yield f"{alltokens} \n\n [Inference time: {elapsed_time:.2f} seconds | Tokens: { tokencount }]"
token_buffer = '' # Reset token buffer
# Log resource usage every minute
if time.time() - monitor_start_time > 60:
cpu_usage = process_monitor.cpu_percent()
memory_usage = process_monitor.memory_info().rss # in bytes
print(f"Subprocess CPU Usage: {cpu_usage}%, Memory Usage: {memory_usage / 1024 ** 2} MB")
monitor_start_time = time.time() # Reset the timer
# Yield the last token if there is any
if token_buffer:
elapsed_time = time.time() - start_time # Calculate elapsed time
alltokens += token_buffer
yield f"{alltokens} \n\n [Inference time: {elapsed_time:.2f} seconds | Average Tokens per second: { round(tokencount / elapsed_time, 2) }]"
finally:
try:
# Wait for the process to complete, with a timeout
process.wait(timeout=60) # Timeout in seconds
except subprocess.TimeoutExpired:
print("Process didn't complete within the timeout. Killing it.")
process.kill()
process.wait() # Ensure proper cleanup
# Wait for the subprocess to finish if it hasn't already
process.stdout.close()
process.stderr.close()
# Check for any errors
if process.returncode != 0:
error_message = process.stderr.read()
print(f"Error: {error_message}")
def custom_generate_response(cust_user_message, prompt_index, category):
"""
Generates a custom response based on the user message, the selected prompt,
and the provided list of prompts, including a custom ending specific to the prompt.
Parameters:
- cust_user_message: The message input from the user.
- prompt_index: The index of the custom prompt to use.
- category: The key of list of prompts to use for generating the response.
"""
prompts_list = Allprompts[category] # Retrieve the correct list of prompts based on the category
prompt, ending = prompts_list[prompt_index] # Unpack the prompt and its ending
cust_user_message = f"{prompt}\n\n{cust_user_message}\n\n{ending}"
yield from generate_response(cust_user_message)
Allprompts = {
"Expansive Problem solving": [
("My problem to solve is", "- please make 10 sub problems have to solve from this:"),
("My process to solve is", "- please make 10 sub processes have to solve from this:"),
("My goal to solve is", "- please make 10 sub goals have to solve from this:"),
("My task to solve is", "- please make 10 sub tasks have to solve from this:"),
("My phase to solve is", "- please make 10 sub phases have to solve from this:"),
("My component to solve is", "- please make 10 sub components have to solve from this:"),
("My element to solve is", "- please make 10 sub elements have to solve from this:"),
("A brief description of my current situation:", "- please list the most important task to pay attention to:"),
("A brief description of my current situation to analyse:", "- please conduct a situational analysis:"),
("A brief description of my current situation to decompose:", "- please conduct a problem decomposition:"),
],
"Random Custom Prompts" : [
("Write a Class Diagram based on the following text:", "Class Diagram:"),
("Write a Pydot code based on the following text:", "Pydot Code:"),
("Describe what a standard happy scene in any movie would be planned in great detail, based on the following text:", "Scene Details"),
("Explain a teardown of the product mentioned in the following text:", "Teardown Details:"),
("Explain the manufacturing of the product mentioned in the following text:", "Manufacturing Details:"),
("Explain the marketing considerations of the product mentioned in the following text:", "Considerations:"),
("Explain the target users considerations of the product mentioned in the following text:", "Target Users Considerations:"),
],
"Business Prompts" : [
("Suggest Product ideas just based off the following text:", "Products:"),
("Write an outline for a business plan for: " , ""),
("Write an example of a detailed report for a Executive Summary for " , "Executive Summary:"),
("Write an example of a detailed report for a Company Description for " , "Company Description:"),
("Write an example of a detailed report for a Market Analysis for " , "Market Analysis:"),
("Write an example of a detailed report for a Marketing and Sales Strategy for " , "Marketing and Sales Strategy:"),
("Write an example of a detailed report for a Product Development for " , "Product Development:"),
("Write an example of a detailed report for a Operations and Management for " , "Operations and Management:"),
("Write an example of a detailed report for a Financial Projections for " , "Financial Projections:"),
("Explain how this to make this product unique from competitors:", "Considerations:"),
],
"Programming Pattern Prompts": [
("Demonstrate a builder pattern in go:", ""),
("Demonstrate zero cost abstractions in go:", ""),
("Demonstrate a builder pattern in rust:", ""),
("Demonstrate Polymorphism in rust:", ""),
("Explain how RAII pattern affects rust:", ""),
("Demonstrate a builder pattern in c++:", ""),
("Explain when to consider using a builder pattern in go:", ""),
("Demonstrate a factory pattern in go:", ""),
("Explain the use of trait objects in rust:", ""),
("Demonstrate a singleton pattern in rust:", ""),
("Explain how to implement the strategy pattern in c++:", ""),
("Demonstrate a decorator pattern in go:", ""),
("Explain the observer pattern in rust:", ""),
("Demonstrate a command pattern in c++:", ""),
("Explain when to consider using a factory pattern in go:", ""),
("Demonstrate a prototype pattern in rust:", ""),
("Explain the use of lifetimes in rust and their impact on patterns:", ""),
("Demonstrate an adapter pattern in c++:", ""),
("Explain the difference between a decorator and a proxy pattern in go:", ""),
("Demonstrate a flyweight pattern in rust:", ""),
("Explain how to implement the iterator pattern in c++:", ""),
("Demonstrate a chain of responsibility pattern in go:", ""),
("Explain the use of smart pointers in c++ and their impact on patterns:", ""),
("Demonstrate a mediator pattern in rust:", ""),
("Explain when to consider using a singleton pattern in go:", ""),
("Demonstrate a memento pattern in c++:", ""),
("Explain the state pattern in rust:", ""),
("Demonstrate a visitor pattern in go:", ""),
("Explain how to implement the template method pattern in c++:", ""),
("Explain how the observer pattern works in c++:", ""),
("Explain the advantages of using a facade pattern in rust:", ""),
("Explain how the template method pattern can be used in go:", ""),
("Demonstrate a strategy pattern in rust:", ""),
("Explain the benefits of using a command pattern in c++:", ""),
("Demonstrate a proxy pattern in go:", ""),
("Explain how the chain of responsibility pattern works in rust:", ""),
("Demonstrate a bridge pattern in c++:", ""),
("Explain when to use a mediator pattern in go:", ""),
("Explain the advantages of using a composite pattern in c++:", ""),
("Explain how the state pattern can be used in rust:", ""),
("Explain the benefits of using an iterator pattern in go:", ""),
("Demonstrate a memento pattern in rust:", ""),
("Explain how the interpreter pattern works in c++:", ""),
("Demonstrate a null object pattern in go:", ""),
("Explain when to consider using a dependency injection pattern in rust:", ""),
("Demonstrate a fluent interface pattern in c++:", ""),
("Explain the advantages of using a repository pattern in go:", ""),
("Demonstrate a circuit breaker pattern in rust:", ""),
("Explain how the throttling pattern can be used in c++:", ""),
("Demonstrate a retry pattern in go:", ""),
("Explain the benefits of using a bulkhead pattern in rust:", ""),
("Demonstrate a CQRS pattern in c++:", ""),
("Explain when to use an event sourcing pattern in go:", ""),
("Demonstrate a saga pattern in rust:", ""),
("Explain how the two-phase commit pattern works in c++:", ""),
],
"Creativity Prompts (Rule observation)": [
("Mention things not stated in the following text:", "Unconsidered, Unmentioned"),
("Make the following text more vague:", "Vague version:"),
("Turn the following text into a bunch of rules:", "Rules:"),
("What Syllogisms can be made from this text:", "Syllogisms:"),
("Reimagine the following text:", ""),
("Extrapolate future scenarios based on the following text:", "Future scenarios:"),
("Compare and contrast the perspectives in this text with those from another text:", "Comparison:"),
("Design a debate based on the arguments presented in this text:", "Debate design:"),
("Create a flowchart that outlines the decision-making process described in this text:", "Flowchart representation:"),
("Transform the main ideas of this text into a board game concept:", "Board game concept:"),
("Identify the underlying assumptions in the following text:", "Assumptions:"),
("Rewrite the following text from a different perspective:", "Alternate perspective:"),
("Summarize the main points of the following text in a haiku:", "Haiku summary:"),
("Create a metaphor for the main idea of the following text:", "Metaphor:"),
("Identify the logical fallacies in the following text:", "Logical fallacies:"),
("Rewrite the following text as a dialogue between two characters:", "Dialogue:"),
("Create a visual representation of the following text:", "Visual representation:"),
("Identify the emotions conveyed in the following text:", "Emotions:"),
("Rewrite the following text in the style of a fairy tale:", "Fairy tale version:"),
("Create a series of questions that challenge the ideas in the following text:", "Challenging questions:"),
("Identify the cultural context and biases in the following text:", "Cultural context and biases:"),
("Rewrite the following text as a news article:", "News article:"),
("Create a poem inspired by the following text:", "Inspired poem:"),
("Identify the implications and consequences of the ideas in the following text:", "Implications and consequences:"),
("Rewrite the following text as a series of tweets:", "Tweet series:"),
("Create a short story that expands on the following text:", "Short story:"),
("Identify the target audience for the following text:", "Target audience:"),
("Rewrite the following text as a persuasive speech:", "Persuasive speech:"),
("Create a series of emojis that represent the main ideas of the following text:", "Emoji representation:"),
("Identify the historical context of the following text:", "Historical context:"),
("Rewrite the following text as a scientific abstract:", "Scientific abstract:"),
("Create a series of memes inspired by the following text:", "Meme series:"),
("Identify the ethical considerations related to the following text:", "Ethical considerations:"),
("Create a parody of the following text:", "Parody:"),
("Identify the subtext and hidden meanings in the following text:", "Subtext and hidden meanings:"),
("Find the implicit assumptions in the following text:", "Implicit assumptions:"),
("Make the following text more abstract:", "Abstract version:"),
("What are the potential consequences of the following text?:", "Consequences:"),
("Rewrite the following text using metaphors:", "Metaphor version:"),
("What questions does the following text raise?:", "Questions raised:"),
("Identify any cause-and-effect relationships in the following text:", "Cause-and-effect:"),
("Make the following text more precise:", "Precise version:"),
("What are the underlying values expressed in the following text?:", "Underlying values:"),
("Rewrite the following text using analogies:", "Analogy version:"),
("What are the potential implications of the following text?:", "Implications:"),
("Identify any paradoxes in the following text:", "Paradoxes:"),
("Rewrite the following text using personification:", "Personification version:"),
("What are the potential biases in the following text?:", "Biases:"),
],
"Game Based" : [
{"Write a story in 10 short sentences (6 words or less):", "1. "},
{"Suggest ways that the following one sentence scenario can be delayed or complicated:", "1. "},
{"Suggest ways that complication in a story can be avoided/subverted:", "Strategies: "},
("What obstacles to growth for a protagonist exist in the following text:", "Obstacles:"),
("Write a story for the basis of a random game", "Story:"),
("What are common themes in games?", ""),
("Write Three factions and why they are at conflict based on the following text:", "Faction 1:"),
]
}
with gr.Blocks() as iface:
with gr.Tab("Single prompt"):
gr.HTML(" -- Original StabilityAI demo -- | ")
gr.Interface(
fn=generate_response,
inputs=gr.Textbox(lines=2, placeholder="Type your message here..."),
outputs="text",
title="Stable LM 2 Zephyr (1.6b) LLama.cpp Interface Test (Inconsistent Performance - 100 tokens in 50 secs (when this HF space is updated) or 800+ secs(HF space open for long))",
description="No Prompt template used yet (Essentially autocomplete). No Message History for now - Enter your message and get a response.",
flagging_dir="/usr/src/app/flagged",
)
gr.HTML("Any standard way of thinking / Repetitive idea / rule of thumb / advice can be turned into a button (In a timeline?)")
gr.HTML("LLM powered Buttons as the new notetaking? (Youtube Video to prompt pipeline?)
List to buttons (Instead of buttons tabs and dropdowns maybe?)")
MainOutput = gr.TextArea(placeholder='Output will show here')
CustomButtonInput = gr.TextArea(lines=1, placeholder='Prompt goes here')
for category_name, category_prompts in Allprompts.items():
with gr.Accordion(f"General {category_name} Pattern based", open=False):
with gr.Group():
for index, (prompt, _) in enumerate(category_prompts):
button = gr.Button(prompt)
button.click(custom_generate_response, inputs=[CustomButtonInput, gr.State(index), gr.State(category_name)], outputs=MainOutput)
with gr.Tab("Workflow Brainstom"):
gr.HTML("Workflow = premeditated events --- need a timeline before prompts")
iface.queue().launch(server_name="0.0.0.0", share=True)