acecalisto3 commited on
Commit
83c7399
1 Parent(s): a9a0e14

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +305 -447
app.py CHANGED
@@ -1,452 +1,310 @@
1
- from huggingface_hub import InferenceClient, hf_hub_url
2
- import gradio as gr
3
- import random
4
  import os
5
  import subprocess
6
- import threading
7
- import time
8
- import shutil
9
- from typing import Dict, Tuple, List
10
- import json
11
- from rich import print as rprint
12
- from rich.panel import Panel
13
- from rich.progress import track
14
- from rich.table import Table
15
- from rich.prompt import Prompt, Confirm
16
- from rich.markdown import Markdown
17
- from rich.traceback import install
18
- install() # Enable rich tracebacks for easier debugging
19
-
20
- # --- Constants ---
21
-
22
- API_URL = "https://api-inference.huggingface.co/models/"
23
- MODEL_NAME = "mistralai/Mixtral-8x7B-Instruct-v0.1" # Replace with your desired model
24
-
25
- # Chat Interface Parameters
26
- DEFAULT_TEMPERATURE = 0.9
27
- DEFAULT_MAX_NEW_TOKENS = 2048
28
- DEFAULT_TOP_P = 0.95
29
- DEFAULT_REPETITION_PENALTY = 1.2
30
-
31
- # Local Server
32
- LOCAL_HOST_PORT = 7860
33
-
34
- # --- Agent Roles ---
35
-
36
- agent_roles: Dict[str, Dict[str, bool]] = {
37
- "Web Developer": {"description": "A master of front-end and back-end web development.", "active": False},
38
- "Prompt Engineer": {"description": "An expert in crafting effective prompts for AI models.", "active": False},
39
- "Python Code Developer": {"description": "A skilled Python programmer who can write clean and efficient code.", "active": False},
40
- "Hugging Face Hub Expert": {"description": "A specialist in navigating and utilizing the Hugging Face Hub.", "active": False},
41
- "AI-Powered Code Assistant": {"description": "An AI assistant that can help with coding tasks and provide code snippets.", "active": False},
42
- }
43
-
44
- # --- Initial Prompt ---
45
-
46
- selected_agent = list(agent_roles.keys())[0]
47
- initial_prompt = f"""
48
- You are an expert {selected_agent} who responds with complete program coding to client requests.
49
- Using available tools, please explain the researched information.
50
- Please don't answer based solely on what you already know. Always perform a search before providing a response.
51
- In special cases, such as when the user specifies a page to read, there's no need to search.
52
- Please read the provided page and answer the user's question accordingly.
53
- If you find that there's not much information just by looking at the search results page, consider these two options and try them out:
54
- - Try clicking on the links of the search results to access and read the content of each page.
55
- - Change your search query and perform a new search.
56
- Users are extremely busy and not as free as you are.
57
- Therefore, to save the user's effort, please provide direct answers.
58
- BAD ANSWER EXAMPLE
59
- - Please refer to these pages.
60
- - You can write code referring these pages.
61
- - Following page will be helpful.
62
- GOOD ANSWER EXAMPLE
63
- - This is the complete code: -- complete code here --
64
- - The answer of you question is -- answer here --
65
- Please make sure to list the URLs of the pages you referenced at the end of your answer. (This will allow users to verify your response.)
66
- Please make sure to answer in the language used by the user. If the user asks in Japanese, please answer in Japanese. If the user asks in Spanish, please answer in Spanish.
67
- But, you can go ahead and search in English, especially for programming-related questions. PLEASE MAKE SURE TO ALWAYS SEARCH IN ENGLISH FOR THOSE.
68
- """
69
-
70
- # --- Custom CSS ---
71
-
72
- customCSS = """
73
- #component-7 {
74
- height: 1600px;
75
- flex-grow: 4;
76
- }
77
- """
78
-
79
- # --- Functions ---
80
-
81
- # Function to toggle the active state of an agent
82
- def toggle_agent(agent_name: str) -> str:
83
- """Toggles the active state of an agent."""
84
- global agent_roles
85
- agent_roles[agent_name]["active"] = not agent_roles[agent_name]["active"]
86
- return f"{agent_name} is now {'active' if agent_roles[agent_name]['active'] else 'inactive'}"
87
-
88
- # Function to get the active agent cluster
89
- def get_agent_cluster() -> Dict[str, bool]:
90
- """Returns a dictionary of active agents."""
91
- return {agent: agent_roles[agent]["active"] for agent in agent_roles}
92
-
93
- # Function to execute code
94
- def run_code(code: str) -> str:
95
- """Executes the provided code and returns the output."""
96
  try:
97
- output = subprocess.check_output(
98
- ['python', '-c', code],
99
- stderr=subprocess.STDOUT,
100
- universal_newlines=True,
101
- )
102
- return output
103
- except subprocess.CalledProcessError as e:
104
- return f"Error: {e.output}"
105
-
106
- # Function to format the prompt
107
- def format_prompt(message: str, history: list[Tuple[str, str]], agent_roles: list[str]) -> str:
108
- """Formats the prompt with the selected agent roles and conversation history."""
109
- prompt = f"""
110
- You are an expert agent cluster, consisting of {', '.join(agent_roles)}.
111
- Respond with complete program coding to client requests.
112
- Using available tools, please explain the researched information.
113
- Please don't answer based solely on what you already know. Always perform a search before providing a response.
114
- In special cases, such as when the user specifies a page to read, there's no need to search.
115
- Please read the provided page and answer the user's question accordingly.
116
- If you find that there's not much information just by looking at the search results page, consider these two options and try them out:
117
- - Try clicking on the links of the search results to access and read the content of each page.
118
- - Change your search query and perform a new search.
119
- Users are extremely busy and not as free as you are.
120
- Therefore, to save the user's effort, please provide direct answers.
121
- BAD ANSWER EXAMPLE
122
- - Please refer to these pages.
123
- - You can write code referring these pages.
124
- - Following page will be helpful.
125
- GOOD ANSWER EXAMPLE
126
- - This is the complete code: -- complete code here --
127
- - The answer of you question is -- answer here --
128
- Please make sure to list the URLs of the pages you referenced at the end of your answer. (This will allow users to verify your response.)
129
- Please make sure to answer in the language used by the user. If the user asks in Japanese, please answer in Japanese. If the user asks in Spanish, please answer in Spanish.
130
- But, you can go ahead and search in English, especially for programming-related questions. PLEASE MAKE SURE TO ALWAYS SEARCH IN ENGLISH FOR THOSE.
131
- """
132
-
133
- for user_prompt, bot_response in history:
134
- prompt += f"[INST] {user_prompt} [/INST]"
135
- prompt += f" {bot_response}</s> "
136
-
137
- prompt += f"[INST] {message} [/INST]"
138
- return prompt
139
-
140
- # Function to generate a response
141
- def generate(prompt: str, history: list[Tuple[str, str]], agent_roles: list[str], temperature: float = DEFAULT_TEMPERATURE, max_new_tokens: int = DEFAULT_MAX_NEW_TOKENS, top_p: float = DEFAULT_TOP_P, repetition_penalty: float = DEFAULT_REPETITION_PENALTY) -> str:
142
- """Generates a response using the selected agent roles and parameters."""
143
- temperature = float(temperature)
144
- if temperature < 1e-2:
145
- temperature = 1e-2
146
- top_p = float(top_p)
147
-
148
- generate_kwargs = dict(
149
- temperature=temperature,
150
- max_new_tokens=max_new_tokens,
151
- top_p=top_p,
152
- repetition_penalty=repetition_penalty,
153
- do_sample=True,
154
- seed=random.randint(0, 10**7),
155
- )
156
-
157
- formatted_prompt = format_prompt(prompt, history, agent_roles)
158
-
159
- stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
160
- output = ""
161
-
162
- for response in stream:
163
- output += response.token.text
164
- yield output
165
- return output
166
-
167
- # Function to handle user input and generate responses
168
- def chat_interface(message: str, history: list[Tuple[str, str]], agent_cluster: Dict[str, bool], temperature: float, max_new_tokens: int, top_p: float, repetition_penalty: float) -> Tuple[str, str]:
169
- """Handles user input and generates responses."""
170
- rprint(f"[bold blue]User:[/bold blue] {message}") # Log user message
171
- if message.startswith("python"):
172
- # User entered code, execute it
173
- code = message[9:-3]
174
- output = run_code(code)
175
- rprint(f"[bold green]Code Output:[/bold green] {output}") # Log code output
176
- return (message, output)
177
  else:
178
- # User entered a normal message, generate a response
179
- active_agents = [agent for agent, is_active in agent_cluster.items() if is_active]
180
- response = generate(message, history, active_agents, temperature, max_new_tokens, top_p, repetition_penalty)
181
- rprint(f"[bold purple]Agent Response:[/bold purple] {response}") # Log agent response
182
- return (message, response)
183
-
184
- # Function to create a new web app instance
185
- def create_web_app(app_name: str, code: str) -> None:
186
- """Creates a new web app instance with the given name and code."""
187
- # Create a new directory for the app
188
- os.makedirs(app_name, exist_ok=True)
189
-
190
- # Create the app.py file
191
- with open(os.path.join(app_name, 'app.py'), 'w') as f:
192
- f.write(code)
193
-
194
- # Create the requirements.txt file
195
- with open(os.path.join(app_name, 'requirements.txt'), 'w') as f:
196
- f.write("gradio\nhuggingface_hub")
197
-
198
- # Print a success message
199
- print(f"Web app '{app_name}' created successfully!")
200
-
201
- # Function to handle the "Create Web App" button click
202
- def create_web_app_button_click(code: str) -> str:
203
- """Handles the "Create Web App" button click."""
204
- # Get the app name from the user
205
- app_name = gr.Textbox.get().strip()
206
-
207
- # Validate the app name
208
- if not app_name:
209
- return "Please enter a valid app name."
210
-
211
- # Create the web app instance
212
- create_web_app(app_name, code)
213
-
214
- # Return a success message
215
- return f"Web app '{app_name}' created successfully!"
216
-
217
- # Function to handle the "Deploy" button click
218
- def deploy_button_click(app_name: str, code: str) -> str:
219
- """Handles the "Deploy" button click."""
220
- # Get the app name from the user
221
- app_name = gr.Textbox.get().strip()
222
-
223
- # Validate the app name
224
- if not app_name:
225
- return "Please enter a valid app name."
226
-
227
- # Get Hugging Face token
228
- hf_token = gr.Textbox.get("hf_token").strip()
229
-
230
- # Validate Hugging Face token
231
- if not hf_token:
232
- return "Please enter a valid Hugging Face token."
233
-
234
- # Create a new directory for the app
235
- os.makedirs(app_name, exist_ok=True)
236
-
237
- # Copy the code to the app directory
238
- with open(os.path.join(app_name, 'app.py'), 'w') as f:
239
- f.write(code)
240
-
241
- # Create the requirements.txt file
242
- with open(os.path.join(app_name, 'requirements.txt'), 'w') as f:
243
- f.write("gradio\nhuggingface_hub")
244
-
245
- # Deploy the app to Hugging Face Spaces
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  try:
247
- subprocess.run(
248
- ['huggingface-cli', 'login', '--token', hf_token],
249
- check=True,
250
- )
251
- subprocess.run(
252
- ['huggingface-cli', 'space', 'create', app_name, '--repo_type', 'spaces', '--private', '--branch', 'main'],
253
- check=True,
254
- )
255
- subprocess.run(
256
- ['git', 'init'],
257
- cwd=app_name,
258
- check=True,
259
- )
260
- subprocess.run(
261
- ['git', 'add', '.'],
262
- cwd=app_name,
263
- check=True,
264
- )
265
- subprocess.run(
266
- ['git', 'commit', '-m', 'Initial commit'],
267
- cwd=app_name,
268
- check=True,
269
- )
270
- subprocess.run(
271
- ['git', 'remote', 'add', 'origin', hf_hub_url(username='your_username', repo_id=app_name)],
272
- cwd=app_name,
273
- check=True,
274
- )
275
- subprocess.run(
276
- ['git', 'push', '-u', 'origin', 'main'],
277
- cwd=app_name,
278
- check=True,
279
- )
280
- return f"Web app '{app_name}' deployed successfully to Hugging Face Spaces!"
281
- except subprocess.CalledProcessError as e:
282
- return f"Error: {e}"
283
-
284
- # Function to handle the "Local Host" button click
285
- def local_host_button_click(app_name: str, code: str) -> str:
286
- """Handles the "Local Host" button click."""
287
- # Get the app name from the user
288
- app_name = gr.Textbox.get().strip()
289
-
290
- # Validate the app name
291
- if not app_name:
292
- return "Please enter a valid app name."
293
-
294
- # Create a new directory for the app
295
- os.makedirs(app_name, exist_ok=True)
296
-
297
- # Copy the code to the app directory
298
- with open(os.path.join(app_name, 'app.py'), 'w') as f:
299
- f.write(code)
300
-
301
- # Create the requirements.txt file
302
- with open(os.path.join(app_name, 'requirements.txt'), 'w') as f:
303
- f.write("gradio\nhuggingface_hub")
304
-
305
- # Start the local server
306
- os.chdir(app_name)
307
- subprocess.Popen(['gradio', 'run', 'app.py', '--share', '--server_port', str(LOCAL_HOST_PORT)])
308
-
309
- # Return a success message
310
- return f"Web app '{app_name}' running locally on port {LOCAL_HOST_PORT}!"
311
-
312
- # Function to handle the "Ship" button click
313
- def ship_button_click(app_name: str, code: str) -> str:
314
- """Handles the "Ship" button click."""
315
- # Get the app name from the user
316
- app_name = gr.Textbox.get().strip()
317
-
318
- # Validate the app name
319
- if not app_name:
320
- return "Please enter a valid app name."
321
-
322
- # Ship the web app instance
323
- # ... (Implement shipping logic here)
324
-
325
- # Return a success message
326
- return f"Web app '{app_name}' shipped successfully!"
327
-
328
- # --- Gradio Interface ---
329
-
330
- with gr.Blocks(theme='ParityError/Interstellar') as demo:
331
- # --- Agent Selection ---
332
- with gr.Row():
333
- for agent_name, agent_data in agent_roles.items():
334
- button = gr.Button(agent_name, variant="secondary")
335
- textbox = gr.Textbox(agent_data["description"], interactive=False)
336
- button.click(toggle_agent, inputs=[button], outputs=[textbox])
337
-
338
- # --- Chat Interface ---
339
- with gr.Row():
340
- chatbot = gr.Chatbot()
341
- chat_interface_input = gr.Textbox(label="Enter your message", placeholder="Ask me anything!")
342
- chat_interface_output = gr.Textbox(label="Response", interactive=False)
343
-
344
- # Parameters
345
- temperature_slider = gr.Slider(
346
- label="Temperature",
347
- value=DEFAULT_TEMPERATURE,
348
- minimum=0.0,
349
- maximum=1.0,
350
- step=0.05,
351
- interactive=True,
352
- info="Higher values generate more diverse outputs",
353
- )
354
- max_new_tokens_slider = gr.Slider(
355
- label="Maximum New Tokens",
356
- value=DEFAULT_MAX_NEW_TOKENS,
357
- minimum=64,
358
- maximum=4096,
359
- step=64,
360
- interactive=True,
361
- info="The maximum number of new tokens",
362
- )
363
- top_p_slider = gr.Slider(
364
- label="Top-p (Nucleus Sampling)",
365
- value=DEFAULT_TOP_P,
366
- minimum=0.0,
367
- maximum=1,
368
- step=0.05,
369
- interactive=True,
370
- info="Higher values sample more low-probability tokens",
371
- )
372
- repetition_penalty_slider = gr.Slider(
373
- label="Repetition Penalty",
374
- value=DEFAULT_REPETITION_PENALTY,
375
- minimum=1.0,
376
- maximum=2.0,
377
- step=0.05,
378
- interactive=True,
379
- info="Penalize repeated tokens",
380
- )
381
-
382
- # Submit Button
383
- submit_button = gr.Button("Submit")
384
-
385
- # Chat Interface Logic
386
- submit_button.click(
387
- chat_interface,
388
- inputs=[
389
- chat_interface_input,
390
- chatbot,
391
- get_agent_cluster,
392
- temperature_slider,
393
- max_new_tokens_slider,
394
- top_p_slider,
395
- repetition_penalty_slider,
396
- ],
397
- outputs=[
398
- chatbot,
399
- chat_interface_output,
400
- ],
401
- )
402
-
403
- # --- Web App Creation ---
404
- with gr.Row():
405
- app_name_input = gr.Textbox(label="App Name", placeholder="Enter your app name")
406
- code_output = gr.Textbox(label="Code", interactive=False)
407
- create_web_app_button = gr.Button("Create Web App")
408
- deploy_button = gr.Button("Deploy")
409
- local_host_button = gr.Button("Local Host")
410
- ship_button = gr.Button("Ship")
411
- hf_token_input = gr.Textbox(label="Hugging Face Token", placeholder="Enter your Hugging Face token")
412
-
413
- # Web App Creation Logic
414
- create_web_app_button.click(
415
- create_web_app_button_click,
416
- inputs=[code_output],
417
- outputs=[gr.Textbox(label="Status", interactive=False)],
418
- )
419
-
420
- # Deploy the web app
421
- deploy_button.click(
422
- deploy_button_click,
423
- inputs=[app_name_input, code_output, hf_token_input],
424
- outputs=[gr.Textbox(label="Status", interactive=False)],
425
- )
426
-
427
- # Local host the web app
428
- local_host_button.click(
429
- local_host_button_click,
430
- inputs=[app_name_input, code_output],
431
- outputs=[gr.Textbox(label="Status", interactive=False)],
432
- )
433
-
434
- # Ship the web app
435
- ship_button.click(
436
- ship_button_click,
437
- inputs=[app_name_input, code_output],
438
- outputs=[gr.Textbox(label="Status", interactive=False)],
439
- )
440
-
441
- # --- Connect Chat Output to Code Output ---
442
- chat_interface_output.change(
443
- lambda x: x,
444
- inputs=[chat_interface_output],
445
- outputs=[code_output],
446
- )
447
-
448
- # --- Initialize Hugging Face Client ---
449
- client = InferenceClient(repo_id=MODEL_NAME, token=os.environ.get("HF_TOKEN"))
450
-
451
- # --- Launch Gradio ---
452
- demo.queue().launch(debug=True)
 
 
 
 
1
  import os
2
  import subprocess
3
+ import logging
4
+ import streamlit as st
5
+ from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer, AutoModel, RagRetriever, AutoModelForSeq2SeqLM
6
+ import torch
7
+ from datetime import datetime
8
+ from huggingface_hub import hf_hub_url, cached_download, HfApi
9
+ from dotenv import load_dotenv
10
+
11
+ # Constants
12
+ HUGGING_FACE_REPO_URL = "https://huggingface.co/spaces/acecalisto3/DevToolKit"
13
+ PROJECT_ROOT = "projects"
14
+ AGENT_DIRECTORY = "agents"
15
+ AVAILABLE_CODE_GENERATIVE_MODELS = [
16
+ "bigcode/starcoder", # Popular and powerful
17
+ "Salesforce/codegen-350M-mono", # Smaller, good for quick tasks
18
+ "microsoft/CodeGPT-small", # Smaller, good for quick tasks
19
+ "google/flan-t5-xl", # Powerful, good for complex tasks
20
+ "facebook/bart-large-cnn", # Good for text-to-code tasks
21
+ ]
22
+
23
+ # Load environment variables
24
+ load_dotenv()
25
+ HF_TOKEN = os.getenv("HUGGING_FACE_API_KEY")
26
+
27
+ # Initialize logger
28
+ logging.basicConfig(level=logging.INFO)
29
+
30
+ # Global state to manage communication between Tool Box and Workspace Chat App
31
+ if 'chat_history' not in st.session_state:
32
+ st.session_state.chat_history = []
33
+ if 'terminal_history' not in st.session_state:
34
+ st.session_state.terminal_history = []
35
+ if 'workspace_projects' not in st.session_state:
36
+ st.session_state.workspace_projects = {}
37
+ if 'available_agents' not in st.session_state:
38
+ st.session_state.available_agents = []
39
+ if 'current_state' not in st.session_state:
40
+ st.session_state.current_state = {
41
+ 'toolbox': {},
42
+ 'workspace_chat': {}
43
+ }
44
+
45
+ # Load pre-trained RAG retriever
46
+ rag_retriever = RagRetriever.from_pretrained("facebook/rag-token-base") # Use a Hugging Face RAG model
47
+
48
+ # Load pre-trained chat model
49
+ chat_model = AutoModelForSeq2SeqLM.from_pretrained("microsoft/DialoGPT-medium") # Use a Hugging Face chat model
50
+
51
+ # Load tokenizer
52
+ tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium")
53
+
54
+ def process_input(user_input):
55
+ # Input pipeline: Tokenize and preprocess user input
56
+ input_ids = tokenizer(user_input, return_tensors="pt").input_ids
57
+ attention_mask = tokenizer(user_input, return_tensors="pt").attention_mask
58
+
59
+ # RAG model: Generate response
60
+ output = rag_retriever(input_ids, attention_mask=attention_mask)
61
+ response = output.generator_outputs[0].sequences[0]
62
+
63
+ # Chat model: Refine response
64
+ chat_input = tokenizer(response, return_tensors="pt")
65
+ chat_input["input_ids"] = chat_input["input_ids"].unsqueeze(0)
66
+ chat_input["attention_mask"] = chat_input["attention_mask"].unsqueeze(0)
67
+ output = chat_model(**chat_input)
68
+ refined_response = output.sequences[0]
69
+
70
+ # Output pipeline: Return final response
71
+ return refined_response
72
+
73
+ def workspace_interface(project_name):
74
+ project_path = os.path.join(PROJECT_ROOT, project_name)
75
+ if os.path.exists(project_path):
76
+ return f"Project '{project_name}' already exists."
77
+ else:
78
+ os.makedirs(project_path)
79
+ st.session_state.workspace_projects[project_name] = {'files': []}
80
+ return f"Project '{project_name}' created successfully."
81
+
82
+ def add_code_to_workspace(project_name, code, file_name):
83
+ project_path = os.path.join(PROJECT_ROOT, project_name)
84
+ if not os.path.exists(project_path):
85
+ return f"Project '{project_name}' does not exist."
86
+
87
+ file_path = os.path.join(project_path, file_name)
 
 
 
 
 
88
  try:
89
+ with open(file_path, "w") as file:
90
+ file.write(code)
91
+ st.session_state.workspace_projects[project_name]['files'].append(file_name)
92
+ return f"Code added to '{file_name}' in project '{project_name}'."
93
+ except Exception as e:
94
+ logging.error(f"Error adding code: {file_name}: {e}")
95
+ return f"Error adding code: {file_name}"
96
+
97
+ def run_code(command, project_name=None):
98
+ if project_name:
99
+ project_path = os.path.join(PROJECT_ROOT, project_name)
100
+ result = subprocess.run(command, shell=True, capture_output=True, text=True, cwd=project_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  else:
102
+ result = subprocess.run(command, shell=True, capture_output=True, text=True)
103
+ return result.stdout
104
+
105
+ def display_chat_history(history):
106
+ chat_history = ""
107
+ for user_input, response in history:
108
+ chat_history += f"User: {user_input}\nAgent: {response}\n\n"
109
+ return chat_history
110
+
111
+ def display_workspace_projects(projects):
112
+ workspace_projects = ""
113
+ for project, details in projects.items():
114
+ workspace_projects += f"Project: {project}\nFiles:\n"
115
+ for file in details['files']:
116
+ workspace_projects += f" - {file}\n"
117
+ return workspace_projects
118
+
119
+ def download_models():
120
+ for model in AVAILABLE_CODE_GENERATIVE_MODELS:
121
+ try:
122
+ cached_model = cached_download(model)
123
+ logging.info(f"Downloaded model '{model}' successfully.")
124
+ except Exception as e:
125
+ logging.error(f"Error downloading model '{model}': {e}")
126
+
127
+ def deploy_space_to_hf(project_name, hf_token):
128
+ repository_name = f"my-awesome-space_{datetime.now().timestamp()}"
129
+ files = get_built_space_files()
130
+ commit_response = deploy_to_git(project_name, repository_name, files)
131
+ if commit_response:
132
+ publish_space(repository_name, hf_token)
133
+ return f"Space '{repository_name}' deployed successfully."
134
+ else:
135
+ return "Failed to commit changes to Space."
136
+
137
+ def get_built_space_files():
138
+ projects = st.session_state.workspace_projects
139
+ files = []
140
+ for project in projects.values():
141
+ for file in project['files']:
142
+ file_path = os.path.join(PROJECT_ROOT, project['project_name'], file)
143
+ with open(file_path, "rb") as file:
144
+ files.append(file.read())
145
+ return files
146
+
147
+ def deploy_to_git(project_name, repository_name, files):
148
+ project_path = os.path.join(PROJECT_ROOT, project_name)
149
+ git_repo_url = hf_hub_url(repository_name)
150
+ git = subprocess.Popen(["git", "init"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=project_path)
151
+ git.communicate()
152
+
153
+ git = subprocess.Popen(["git", "add", "-A"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=project_path)
154
+ git.communicate()
155
+
156
+ for file in files:
157
+ filename = "temp.txt"
158
+ with open("temp.txt", "wb") as temp_file:
159
+ temp_file.write(file)
160
+ git = subprocess.Popen(["git", "add", filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=project_path)
161
+ git.communicate()
162
+ os.remove("temp.txt")
163
+
164
+ git = subprocess.Popen(["git", "commit", "-m", "Initial commit"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=project_path)
165
+ git.communicate()
166
+
167
+ return git.returncode == 0
168
+
169
+ def publish_space(repository_name, hf_token):
170
+ api = HfApi(token=hf_token)
171
+ api.create_model(repository_name, files=[], push_to_hub=True)
172
+
173
+ def handle_autonomous_build():
174
+ if not st.session_state.workspace_projects or not st.session_state.available_agents:
175
+ st.error("No projects or agents available to build.")
176
+ return
177
+
178
+ project_name = st.session_state.workspace_projects.keys()[0]
179
+ selected_agent = st.session_state.available_agents[0]
180
+ code_idea = st.session_state.current_state["workspace_chat"]["user_input"]
181
+ code_generative_model = next((model for model in AVAILABLE_CODE_GENERATIVE_MODELS if model in st.session_state.current_state["toolbox"]["selected_models"]), None)
182
+
183
+ if not code_generative_model:
184
+ st.error("No code-generative model selected.")
185
+ return
186
+
187
+ logging.info(f"Building project '{project_name}' with agent '{selected_agent}' and model '{code_generative_model}'.")
188
+
189
  try:
190
+ # TODO: Add code to run the build process here
191
+ # This could include generating code, running it, and updating the workspace projects
192
+ # The build process should also update the UI with the build summary and next steps
193
+ summary, next_step = build_project(project_name, selected_agent, code_idea, code_generative_model)
194
+ st.write(f"Build summary: {summary}")
195
+ st.write(f"Next step: {next_step}")
196
+
197
+ if next_step == "Deploy to Hugging Face Hub":
198
+ deploy_response = deploy_space_to_hf(project_name, HF_TOKEN)
199
+ st.write(deploy_response)
200
+ except Exception as e:
201
+ logging.error(f"Error during build process: {e}")
202
+ st.error("Error during build process.")
203
+
204
+ def build_project(project_name, agent, code_idea, code_generative_model):
205
+ # TODO: Add code to build the project here
206
+ # This could include generating code, running it, and updating the workspace projects
207
+ # The build process should also return a summary and next step
208
+ summary = "Project built successfully."
209
+ next_step = ""
210
+ return summary, next_step
211
+
212
+ def main():
213
+ # Initialize the app
214
+ st.title("AI Agent Creator")
215
+
216
+ # Sidebar navigation
217
+ st.sidebar.title("Navigation")
218
+ app_mode = st.sidebar.selectbox("Choose the app mode", ["AI Agent Creator", "Tool Box", "Workspace Chat App"])
219
+
220
+ if app_mode == "AI Agent Creator":
221
+ # AI Agent Creator
222
+ st.header("Create an AI Agent from Text")
223
+
224
+ st.subheader("From Text")
225
+ agent_name = st.text_input("Enter agent name:")
226
+ text_input = st.text_area("Enter skills (one per line):")
227
+ if st.button("Create Agent"):
228
+ skills = text_input.split('\n')
229
+ try:
230
+ agent = AIAgent(agent_name, "AI agent created from text input", skills)
231
+ st.session_state.available_agents.append(agent_name)
232
+ st.success(f"Agent '{agent_name}' created and saved successfully.")
233
+ except Exception as e:
234
+ st.error(f"Error creating agent: {e}")
235
+
236
+ elif app_mode == "Tool Box":
237
+ # Tool Box
238
+ st.header("AI-Powered Tools")
239
+
240
+ # Chat Interface
241
+ st.subheader("Chat with CodeCraft")
242
+ chat_input = st.text_area("Enter your message:")
243
+ if st.button("Send"):
244
+ response = process_input(chat_input)
245
+ st.session_state.chat_history.append((chat_input, response))
246
+ st.write(f"CodeCraft: {response}")
247
+
248
+ # Terminal Interface
249
+ st.subheader("Terminal")
250
+ terminal_input = st.text_input("Enter a command:")
251
+ if st.button("Run"):
252
+ output = run_code(terminal_input)
253
+ st.session_state.terminal_history.append((terminal_input, output))
254
+ st.code(output, language="bash")
255
+
256
+ # Project Management
257
+ st.subheader("Project Management")
258
+ project_name_input = st.text_input("Enter Project Name:")
259
+ if st.button("Create Project"):
260
+ status = workspace_interface(project_name_input)
261
+ st.write(status)
262
+
263
+ code_to_add = st.text_area("Enter Code to Add to Workspace:", height=150)
264
+ file_name_input = st.text_input("Enter File Name (e.g., 'app.py'):")
265
+ if st.button("Add Code"):
266
+ status = add_code_to_workspace(project_name_input, code_to_add, file_name_input)
267
+ st.write(status)
268
+
269
+ # Display Chat History
270
+ st.subheader("Chat History")
271
+ chat_history = display_chat_history(st.session_state.chat_history)
272
+ st.text_area("Chat History", value=chat_history, height=200)
273
+
274
+ # Display Workspace Projects
275
+ st.subheader("Workspace Projects")
276
+ workspace_projects = display_workspace_projects(st.session_state.workspace_projects)
277
+ st.text_area("Workspace Projects", value=workspace_projects, height=200)
278
+
279
+ # Download and deploy models
280
+ if st.button("Download and Deploy Models"):
281
+ download_models()
282
+ st.info("Models downloaded and deployed.")
283
+
284
+ elif app_mode == "Workspace Chat App":
285
+ # Workspace Chat App
286
+ st.header("Workspace Chat App")
287
+
288
+ # Chat Interface with AI Agents
289
+ st.subheader("Chat with AI Agents")
290
+ selected_agent = st.selectbox("Select an AI agent", st.session_state.available_agents)
291
+ agent_chat_input = st.text_area("Enter your message for the agent:")
292
+ if st.button("Send to Agent"):
293
+ response = process_input(agent_chat_input)
294
+ st.session_state.chat_history.append((agent_chat_input, response))
295
+ st.write(f"{selected_agent}: {response}")
296
+
297
+ # Code Generation
298
+ st.subheader("Code Generation")
299
+ code_idea = st.text_input("Enter your code idea:")
300
+ selected_model = st.selectbox("Select a code-generative model", AVAILABLE_CODE_GENERATIVE_MODELS)
301
+ if st.button("Generate Code"):
302
+ generated_code = run_code(code_idea)
303
+ st.code(generated_code, language="python")
304
+
305
+ # Autonomous build process
306
+ if st.button("Automate Build Process"):
307
+ handle_autonomous_build()
308
+
309
+ if __name__ == "__main__":
310
+ main()