Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -12,6 +12,10 @@ from llama_cpp import Llama, LlamaCppPythonProvider, LlamaCppAgent
|
|
12 |
from llama_cpp.llama_cpp_agent import get_messages_formatter_type, get_context_by_model
|
13 |
from io import StringIO
|
14 |
import tempfile
|
|
|
|
|
|
|
|
|
15 |
|
16 |
# --- Global Variables ---
|
17 |
CURRENT_PROJECT = {} # Store project data (code, packages, etc.)
|
@@ -105,19 +109,16 @@ def execute_pip_command(command, add_message):
|
|
105 |
time.sleep(0.1) # Simulate delay for more realistic streaming
|
106 |
rc = process.poll()
|
107 |
return rc
|
108 |
-
|
109 |
def generate_text(input_text):
|
110 |
"""Generates text using the loaded language model."""
|
111 |
inputs = tokenizer(input_text, return_tensors="pt")
|
112 |
output = model.generate(**inputs, max_length=500, num_return_sequences=1)
|
113 |
return tokenizer.decode(output[0], skip_special_tokens=True)
|
114 |
-
|
115 |
# --- AI Agent Functions ---
|
116 |
def analyze_user_intent(user_input):
|
117 |
"""Classifies the user's intent based on their input."""
|
118 |
classification = classifier(user_input)
|
119 |
return classification[0]['label']
|
120 |
-
|
121 |
def generate_mini_app_ideas(theme):
|
122 |
"""Generates mini-app ideas based on the user's theme."""
|
123 |
if theme.lower() == "productivity":
|
@@ -140,14 +141,12 @@ def generate_mini_app_ideas(theme):
|
|
140 |
]
|
141 |
else:
|
142 |
return ["No matching mini-apps found. Try a different theme."]
|
143 |
-
|
144 |
def generate_app_code(app_name, app_description, model_name, history):
|
145 |
"""Generates code for the selected mini-app using the specified GGUF model."""
|
146 |
prompt = f"'"Write a Python script for a {app_description} named {app_name} using Gradio and Streamlit:"
|
147 |
agent = get_agent(model_name)
|
148 |
generated_code = agent.chat(prompt, history)
|
149 |
return generated_code
|
150 |
-
|
151 |
def execute_terminal_command(command):
|
152 |
"""Executes a terminal command and returns the output."""
|
153 |
try:
|
@@ -155,7 +154,6 @@ def execute_terminal_command(command):
|
|
155 |
return result.strip(), None
|
156 |
except subprocess.CalledProcessError as e:
|
157 |
return e.output.strip(), str(e)
|
158 |
-
|
159 |
def install_package(package_name):
|
160 |
"""Installs a package using pip."""
|
161 |
output, error = execute_terminal_command(f"'"pip install {package_name}")
|
@@ -163,22 +161,17 @@ def install_package(package_name):
|
|
163 |
return f"'"Error installing package: {error}"
|
164 |
else:
|
165 |
return f"'"Package `{package_name}` installed successfully."
|
166 |
-
|
167 |
def get_project_data():
|
168 |
"""Returns the current project data."""
|
169 |
return CURRENT_PROJECT
|
170 |
-
|
171 |
def update_project_data(key, value):
|
172 |
"""Updates the project data."""
|
173 |
CURRENT_PROJECT[key] = value
|
174 |
-
|
175 |
def handle_chat(input_text, history):
|
176 |
"""Handles user input in the chat interface."""
|
177 |
def add_message(sender, message):
|
178 |
history.append((sender, message))
|
179 |
-
|
180 |
add_message("User", input_text)
|
181 |
-
|
182 |
if input_text.startswith("pip install ") or input_text.startswith("https://pypi.org/project/"):
|
183 |
package_name = extract_package_name(input_text)
|
184 |
add_message("System", f"'"Installing `{package_name}`...")
|
@@ -186,7 +179,6 @@ def handle_chat(input_text, history):
|
|
186 |
add_message("System", result)
|
187 |
update_project_data("packages", CURRENT_PROJECT.get("packages", []) + [package_name])
|
188 |
return history, dynamic_functions
|
189 |
-
|
190 |
# --- AI Agent Interaction ---
|
191 |
if USER_INTENT is None:
|
192 |
add_message("System", analyze_user_intent(input_text))
|
@@ -203,10 +195,7 @@ def handle_chat(input_text, history):
|
|
203 |
add_message("System", f"'"Generating code for {app_description}...")
|
204 |
code = generate_app_code(selected_app, app_description, "CodeQwen", history) # Use CodeQwen by default
|
205 |
add_message("System", f"'"
|
206 |
-
|
207 |
-
|
208 |
python\n{code}\n
|
209 |
-
|
210 |
add_message("System", "Code generated! What else can I do for you?")
|
211 |
update_project_data("code", code)
|
212 |
update_project_data("app_name", selected_app)
|
@@ -215,29 +204,23 @@ add_message("System", "Code generated! What else can I do for you?")
|
|
215 |
add_message("System", "Please choose from the provided mini-app ideas.")
|
216 |
else:
|
217 |
add_message("System", "You already have an app in progress. Do you want to start over?")
|
218 |
-
|
219 |
return history, dynamic_functions
|
220 |
-
|
221 |
# --- Prebuilt Tools ---
|
222 |
def generate_code_tool(input_text, history):
|
223 |
"""Prebuilt tool for code generation."""
|
224 |
code = generate_app_code("MyTool", "A tool to do something", "CodeQwen", history) # Use CodeQwen by default
|
225 |
return f"'" python {code}"
|
226 |
-
|
227 |
def analyze_code_tool(input_text, history):
|
228 |
"""Prebuilt tool for code analysis."""
|
229 |
agent = get_agent("Codestral")
|
230 |
analysis = agent.chat(input_text, history)
|
231 |
return analysis
|
232 |
-
|
233 |
# --- Streamlit Interface ---
|
234 |
st.title("AI4ME: Your Personal AI App Workshop")
|
235 |
st.markdown("## Let's build your dream app together! 🤖")
|
236 |
-
|
237 |
# --- Hugging Face Token Input ---
|
238 |
huggingface_token = st.text_input("Enter your Hugging Face Token", type="password", key="huggingface_token")
|
239 |
os.environ["huggingface_token"] = huggingface_token
|
240 |
-
|
241 |
# --- Chat Interface ---
|
242 |
chat_history = []
|
243 |
chat_input = st.text_input("Tell me your idea...", key="chat_input")
|
@@ -245,16 +228,13 @@ if chat_input:
|
|
245 |
chat_history, dynamic_functions = handle_chat(chat_input, chat_history)
|
246 |
for sender, message in chat_history:
|
247 |
st.markdown(f"**{sender}:** {message}")
|
248 |
-
|
249 |
# --- Code Execution and Deployment ---
|
250 |
if CURRENT_APP["code"]:
|
251 |
st.markdown("## Your App Code:")
|
252 |
code_area = st.text_area("Your App Code", value=CURRENT_APP["code"], key="code_area")
|
253 |
-
|
254 |
st.markdown("## Deploy Your App (Coming Soon!)")
|
255 |
# Add deployment functionality here using Streamlit's deployment features.
|
256 |
# For example, you could use Streamlit's `st.button` to trigger deployment.
|
257 |
-
|
258 |
# --- Code Execution ---
|
259 |
st.markdown("## Run Your App:")
|
260 |
if st.button("Execute Code"):
|
@@ -266,27 +246,21 @@ if CURRENT_APP["code"]:
|
|
266 |
st.success(f"'"Code executed successfully!{output}")
|
267 |
except Exception as e:
|
268 |
st.error(f"'"Error executing code: {e}")
|
269 |
-
|
270 |
# --- Code Editing ---
|
271 |
st.markdown("## Edit Your Code:")
|
272 |
if st.button("Edit Code"):
|
273 |
try:
|
274 |
# Use Hugging Face's text-generation pipeline for code editing
|
275 |
prompt = f"'"Improve the following Python code: python {code_area}"
|
276 |
-
|
277 |
inputs = tokenizer(prompt, return_tensors="pt")
|
278 |
output = model.generate(**inputs, max_length=500, num_return_sequences=1)
|
279 |
edited_code = tokenizer.decode(output[0], skip_special_tokens=True).split("
|
280 |
-
|
281 |
-
|
282 |
python\n")[1].split("\n
|
283 |
-
|
284 |
st.success(f"'"Code edited successfully!\n{edited_code}")
|
285 |
update_project_data("code", edited_code)
|
286 |
code_area.value = edited_code
|
287 |
except Exception as e:
|
288 |
st.error(f"'"Error editing code: {e}")
|
289 |
-
|
290 |
# --- Prebuilt Tools ---
|
291 |
st.markdown("## Prebuilt Tools:")
|
292 |
with st.expander("Generate Code"):
|
@@ -294,13 +268,11 @@ with st.expander("Generate Code"):
|
|
294 |
if st.button("Generate"):
|
295 |
code_output = generate_code_tool(code_input, chat_history)
|
296 |
st.markdown(code_output)
|
297 |
-
|
298 |
with st.expander("Analyze Code"):
|
299 |
code_input = st.text_area("Enter your code:", key="analyze_code_input")
|
300 |
if st.button("Analyze"):
|
301 |
analysis_output = analyze_code_tool(code_input, chat_history)
|
302 |
st.markdown(analysis_output)
|
303 |
-
|
304 |
# --- Additional Features ---
|
305 |
# Add features like:
|
306 |
# - Code editing
|
|
|
12 |
from llama_cpp.llama_cpp_agent import get_messages_formatter_type, get_context_by_model
|
13 |
from io import StringIO
|
14 |
import tempfile
|
15 |
+
import importlib
|
16 |
+
import time
|
17 |
+
import sys
|
18 |
+
from flask import Flask
|
19 |
|
20 |
# --- Global Variables ---
|
21 |
CURRENT_PROJECT = {} # Store project data (code, packages, etc.)
|
|
|
109 |
time.sleep(0.1) # Simulate delay for more realistic streaming
|
110 |
rc = process.poll()
|
111 |
return rc
|
|
|
112 |
def generate_text(input_text):
|
113 |
"""Generates text using the loaded language model."""
|
114 |
inputs = tokenizer(input_text, return_tensors="pt")
|
115 |
output = model.generate(**inputs, max_length=500, num_return_sequences=1)
|
116 |
return tokenizer.decode(output[0], skip_special_tokens=True)
|
|
|
117 |
# --- AI Agent Functions ---
|
118 |
def analyze_user_intent(user_input):
|
119 |
"""Classifies the user's intent based on their input."""
|
120 |
classification = classifier(user_input)
|
121 |
return classification[0]['label']
|
|
|
122 |
def generate_mini_app_ideas(theme):
|
123 |
"""Generates mini-app ideas based on the user's theme."""
|
124 |
if theme.lower() == "productivity":
|
|
|
141 |
]
|
142 |
else:
|
143 |
return ["No matching mini-apps found. Try a different theme."]
|
|
|
144 |
def generate_app_code(app_name, app_description, model_name, history):
|
145 |
"""Generates code for the selected mini-app using the specified GGUF model."""
|
146 |
prompt = f"'"Write a Python script for a {app_description} named {app_name} using Gradio and Streamlit:"
|
147 |
agent = get_agent(model_name)
|
148 |
generated_code = agent.chat(prompt, history)
|
149 |
return generated_code
|
|
|
150 |
def execute_terminal_command(command):
|
151 |
"""Executes a terminal command and returns the output."""
|
152 |
try:
|
|
|
154 |
return result.strip(), None
|
155 |
except subprocess.CalledProcessError as e:
|
156 |
return e.output.strip(), str(e)
|
|
|
157 |
def install_package(package_name):
|
158 |
"""Installs a package using pip."""
|
159 |
output, error = execute_terminal_command(f"'"pip install {package_name}")
|
|
|
161 |
return f"'"Error installing package: {error}"
|
162 |
else:
|
163 |
return f"'"Package `{package_name}` installed successfully."
|
|
|
164 |
def get_project_data():
|
165 |
"""Returns the current project data."""
|
166 |
return CURRENT_PROJECT
|
|
|
167 |
def update_project_data(key, value):
|
168 |
"""Updates the project data."""
|
169 |
CURRENT_PROJECT[key] = value
|
|
|
170 |
def handle_chat(input_text, history):
|
171 |
"""Handles user input in the chat interface."""
|
172 |
def add_message(sender, message):
|
173 |
history.append((sender, message))
|
|
|
174 |
add_message("User", input_text)
|
|
|
175 |
if input_text.startswith("pip install ") or input_text.startswith("https://pypi.org/project/"):
|
176 |
package_name = extract_package_name(input_text)
|
177 |
add_message("System", f"'"Installing `{package_name}`...")
|
|
|
179 |
add_message("System", result)
|
180 |
update_project_data("packages", CURRENT_PROJECT.get("packages", []) + [package_name])
|
181 |
return history, dynamic_functions
|
|
|
182 |
# --- AI Agent Interaction ---
|
183 |
if USER_INTENT is None:
|
184 |
add_message("System", analyze_user_intent(input_text))
|
|
|
195 |
add_message("System", f"'"Generating code for {app_description}...")
|
196 |
code = generate_app_code(selected_app, app_description, "CodeQwen", history) # Use CodeQwen by default
|
197 |
add_message("System", f"'"
|
|
|
|
|
198 |
python\n{code}\n
|
|
|
199 |
add_message("System", "Code generated! What else can I do for you?")
|
200 |
update_project_data("code", code)
|
201 |
update_project_data("app_name", selected_app)
|
|
|
204 |
add_message("System", "Please choose from the provided mini-app ideas.")
|
205 |
else:
|
206 |
add_message("System", "You already have an app in progress. Do you want to start over?")
|
|
|
207 |
return history, dynamic_functions
|
|
|
208 |
# --- Prebuilt Tools ---
|
209 |
def generate_code_tool(input_text, history):
|
210 |
"""Prebuilt tool for code generation."""
|
211 |
code = generate_app_code("MyTool", "A tool to do something", "CodeQwen", history) # Use CodeQwen by default
|
212 |
return f"'" python {code}"
|
|
|
213 |
def analyze_code_tool(input_text, history):
|
214 |
"""Prebuilt tool for code analysis."""
|
215 |
agent = get_agent("Codestral")
|
216 |
analysis = agent.chat(input_text, history)
|
217 |
return analysis
|
|
|
218 |
# --- Streamlit Interface ---
|
219 |
st.title("AI4ME: Your Personal AI App Workshop")
|
220 |
st.markdown("## Let's build your dream app together! 🤖")
|
|
|
221 |
# --- Hugging Face Token Input ---
|
222 |
huggingface_token = st.text_input("Enter your Hugging Face Token", type="password", key="huggingface_token")
|
223 |
os.environ["huggingface_token"] = huggingface_token
|
|
|
224 |
# --- Chat Interface ---
|
225 |
chat_history = []
|
226 |
chat_input = st.text_input("Tell me your idea...", key="chat_input")
|
|
|
228 |
chat_history, dynamic_functions = handle_chat(chat_input, chat_history)
|
229 |
for sender, message in chat_history:
|
230 |
st.markdown(f"**{sender}:** {message}")
|
|
|
231 |
# --- Code Execution and Deployment ---
|
232 |
if CURRENT_APP["code"]:
|
233 |
st.markdown("## Your App Code:")
|
234 |
code_area = st.text_area("Your App Code", value=CURRENT_APP["code"], key="code_area")
|
|
|
235 |
st.markdown("## Deploy Your App (Coming Soon!)")
|
236 |
# Add deployment functionality here using Streamlit's deployment features.
|
237 |
# For example, you could use Streamlit's `st.button` to trigger deployment.
|
|
|
238 |
# --- Code Execution ---
|
239 |
st.markdown("## Run Your App:")
|
240 |
if st.button("Execute Code"):
|
|
|
246 |
st.success(f"'"Code executed successfully!{output}")
|
247 |
except Exception as e:
|
248 |
st.error(f"'"Error executing code: {e}")
|
|
|
249 |
# --- Code Editing ---
|
250 |
st.markdown("## Edit Your Code:")
|
251 |
if st.button("Edit Code"):
|
252 |
try:
|
253 |
# Use Hugging Face's text-generation pipeline for code editing
|
254 |
prompt = f"'"Improve the following Python code: python {code_area}"
|
|
|
255 |
inputs = tokenizer(prompt, return_tensors="pt")
|
256 |
output = model.generate(**inputs, max_length=500, num_return_sequences=1)
|
257 |
edited_code = tokenizer.decode(output[0], skip_special_tokens=True).split("
|
|
|
|
|
258 |
python\n")[1].split("\n
|
|
|
259 |
st.success(f"'"Code edited successfully!\n{edited_code}")
|
260 |
update_project_data("code", edited_code)
|
261 |
code_area.value = edited_code
|
262 |
except Exception as e:
|
263 |
st.error(f"'"Error editing code: {e}")
|
|
|
264 |
# --- Prebuilt Tools ---
|
265 |
st.markdown("## Prebuilt Tools:")
|
266 |
with st.expander("Generate Code"):
|
|
|
268 |
if st.button("Generate"):
|
269 |
code_output = generate_code_tool(code_input, chat_history)
|
270 |
st.markdown(code_output)
|
|
|
271 |
with st.expander("Analyze Code"):
|
272 |
code_input = st.text_area("Enter your code:", key="analyze_code_input")
|
273 |
if st.button("Analyze"):
|
274 |
analysis_output = analyze_code_tool(code_input, chat_history)
|
275 |
st.markdown(analysis_output)
|
|
|
276 |
# --- Additional Features ---
|
277 |
# Add features like:
|
278 |
# - Code editing
|