Update app.py
Browse files
app.py
CHANGED
@@ -3,13 +3,14 @@ from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
3 |
import torch
|
4 |
import spaces # Import the spaces library
|
5 |
|
6 |
-
# Model IDs from Hugging Face Hub (now
|
7 |
model_ids = {
|
8 |
"1.5B": "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",
|
9 |
"7B": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
|
|
|
10 |
}
|
11 |
|
12 |
-
# Revised Default Prompts
|
13 |
default_prompt_1_5b = """**Code Analysis Task**
|
14 |
As a Senior Code Analyst, analyze this programming problem:
|
15 |
|
@@ -22,12 +23,12 @@ As a Senior Code Analyst, analyze this programming problem:
|
|
22 |
**Analysis Required:**
|
23 |
1. Briefly break down the problem, including key constraints and edge cases.
|
24 |
2. Suggest 2-3 potential approach options (algorithms/data structures).
|
25 |
-
3. Recommend
|
26 |
-
4. Provide a very brief initial pseudocode sketch of the core logic."""
|
27 |
|
28 |
|
29 |
default_prompt_7b = """**Code Implementation Task**
|
30 |
-
As a Principal Software Engineer,
|
31 |
|
32 |
**Initial Analysis:**
|
33 |
{response_1_5b}
|
@@ -35,11 +36,11 @@ As a Principal Software Engineer, develop a solution based on this analysis:
|
|
35 |
**Relevant Context:**
|
36 |
{context_7b}
|
37 |
|
38 |
-
**
|
39 |
-
1.
|
40 |
-
2.
|
41 |
-
3.
|
42 |
-
|
43 |
|
44 |
|
45 |
# Function to load model and tokenizer (same)
|
@@ -53,7 +54,7 @@ def load_model_and_tokenizer(model_id):
|
|
53 |
)
|
54 |
return model, tokenizer
|
55 |
|
56 |
-
# Load the selected models and tokenizers (
|
57 |
models = {}
|
58 |
tokenizers = {}
|
59 |
for size, model_id in model_ids.items():
|
@@ -83,16 +84,16 @@ def retrieve_from_memory(query, top_k=2):
|
|
83 |
return relevant_memories[:top_k]
|
84 |
|
85 |
|
86 |
-
# --- Swarm Agent Function with
|
87 |
@spaces.GPU # <---- GPU DECORATOR ADDED HERE!
|
88 |
-
def swarm_agent_sequential_rag(user_prompt, prompt_1_5b_template, prompt_7b_template, temperature=0.5, top_p=0.9, max_new_tokens=300): #
|
89 |
global shared_memory
|
90 |
shared_memory = [] # Clear memory for each new request
|
91 |
|
92 |
-
print("\n--- Swarm Agent Processing with Shared Memory (RAG) - GPU ACCELERATED ---") # Updated message
|
93 |
|
94 |
# 1.5B Model - Brainstorming/Initial Draft (same logic)
|
95 |
-
print("\n[1.5B Model - Brainstorming] - GPU Accelerated")
|
96 |
retrieved_memory_1_5b = retrieve_from_memory(user_prompt)
|
97 |
context_1_5b = "\n".join([f"- {mem}" for mem in retrieved_memory_1_5b]) if retrieved_memory_1_5b else "No relevant context found in memory."
|
98 |
|
@@ -111,37 +112,59 @@ def swarm_agent_sequential_rag(user_prompt, prompt_1_5b_template, prompt_7b_temp
|
|
111 |
print(f"1.5B Response:\n{response_1_5b}")
|
112 |
store_in_memory(f"1.5B Model Initial Response: {response_1_5b[:200]}...")
|
113 |
|
114 |
-
#
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
do_sample=True
|
130 |
)
|
131 |
-
|
132 |
-
print(f"
|
133 |
-
store_in_memory(f"
|
134 |
|
135 |
-
return
|
136 |
|
137 |
|
138 |
-
# --- Gradio ChatInterface --- (
|
139 |
-
def gradio_interface(message, history, temp, top_p, max_tokens, prompt_1_5b_text, prompt_7b_text): #
|
140 |
# history is automatically managed by ChatInterface
|
141 |
response = swarm_agent_sequential_rag(
|
142 |
message,
|
143 |
prompt_1_5b_template=prompt_1_5b_text, # Pass prompt templates
|
144 |
prompt_7b_template=prompt_7b_text,
|
|
|
145 |
temperature=temp,
|
146 |
top_p=top_p,
|
147 |
max_new_tokens=int(max_tokens) # Ensure max_tokens is an integer
|
@@ -150,16 +173,17 @@ def gradio_interface(message, history, temp, top_p, max_tokens, prompt_1_5b_text
|
|
150 |
|
151 |
iface = gr.ChatInterface( # Using ChatInterface now
|
152 |
fn=gradio_interface,
|
153 |
-
# Define additional inputs for settings and
|
154 |
additional_inputs=[
|
155 |
gr.Slider(minimum=0.1, maximum=1.0, step=0.1, value=0.5, label="Temperature"), # Lowered default temp to 0.5
|
156 |
gr.Slider(minimum=0.01, maximum=1.0, step=0.05, value=0.9, label="Top P"),
|
157 |
gr.Number(value=300, label="Max Tokens", precision=0), # Use Number for integer tokens
|
158 |
gr.Textbox(value=default_prompt_1_5b, lines=10, label="1.5B Model Prompt Template"), # Textbox for 1.5B prompt
|
159 |
gr.Textbox(value=default_prompt_7b, lines=10, label="7B Model Prompt Template"), # Textbox for 7B prompt
|
|
|
160 |
],
|
161 |
-
title="DeepSeek Agent Swarm Chat (ZeroGPU Demo - 2 Models
|
162 |
-
description="Chat with a DeepSeek agent swarm (1.5B
|
163 |
)
|
164 |
|
165 |
if __name__ == "__main__":
|
|
|
3 |
import torch
|
4 |
import spaces # Import the spaces library
|
5 |
|
6 |
+
# Model IDs from Hugging Face Hub (now 1.5B, 7B, and 14B)
|
7 |
model_ids = {
|
8 |
"1.5B": "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",
|
9 |
"7B": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
|
10 |
+
"14B": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", # Added 14B back
|
11 |
}
|
12 |
|
13 |
+
# Revised Default Prompts (as defined above)
|
14 |
default_prompt_1_5b = """**Code Analysis Task**
|
15 |
As a Senior Code Analyst, analyze this programming problem:
|
16 |
|
|
|
23 |
**Analysis Required:**
|
24 |
1. Briefly break down the problem, including key constraints and edge cases.
|
25 |
2. Suggest 2-3 potential approach options (algorithms/data structures).
|
26 |
+
3. Recommend ONE primary strategy and briefly justify your choice.
|
27 |
+
4. Provide a very brief initial pseudocode sketch of the core logic."""
|
28 |
|
29 |
|
30 |
default_prompt_7b = """**Code Implementation Task**
|
31 |
+
As a Principal Software Engineer, provide production-ready Streamlit/Python code based on this analysis:
|
32 |
|
33 |
**Initial Analysis:**
|
34 |
{response_1_5b}
|
|
|
36 |
**Relevant Context:**
|
37 |
{context_7b}
|
38 |
|
39 |
+
**Code Requirements:**
|
40 |
+
1. Generate concise, production-grade Python code for a Streamlit app.
|
41 |
+
2. Include necessary imports, UI elements, and basic functionality.
|
42 |
+
3. Add comments for clarity.
|
43 |
+
"""
|
44 |
|
45 |
|
46 |
# Function to load model and tokenizer (same)
|
|
|
54 |
)
|
55 |
return model, tokenizer
|
56 |
|
57 |
+
# Load the selected models and tokenizers (now loads 1.5B, 7B, 14B)
|
58 |
models = {}
|
59 |
tokenizers = {}
|
60 |
for size, model_id in model_ids.items():
|
|
|
84 |
return relevant_memories[:top_k]
|
85 |
|
86 |
|
87 |
+
# --- Swarm Agent Function with Model Swapping ---
|
88 |
@spaces.GPU # <---- GPU DECORATOR ADDED HERE!
|
89 |
+
def swarm_agent_sequential_rag(user_prompt, prompt_1_5b_template, prompt_7b_template, final_model_size="7B", temperature=0.5, top_p=0.9, max_new_tokens=300): # Added final_model_size
|
90 |
global shared_memory
|
91 |
shared_memory = [] # Clear memory for each new request
|
92 |
|
93 |
+
print(f"\n--- Swarm Agent Processing with Shared Memory (RAG) - GPU ACCELERATED - Final Model: {final_model_size} ---") # Updated message
|
94 |
|
95 |
# 1.5B Model - Brainstorming/Initial Draft (same logic)
|
96 |
+
print("\n[1.5B Model - Brainstorming] - GPU Accelerated")
|
97 |
retrieved_memory_1_5b = retrieve_from_memory(user_prompt)
|
98 |
context_1_5b = "\n".join([f"- {mem}" for mem in retrieved_memory_1_5b]) if retrieved_memory_1_5b else "No relevant context found in memory."
|
99 |
|
|
|
112 |
print(f"1.5B Response:\n{response_1_5b}")
|
113 |
store_in_memory(f"1.5B Model Initial Response: {response_1_5b[:200]}...")
|
114 |
|
115 |
+
# Final Stage Model Selection (7B or 14B)
|
116 |
+
if final_model_size == "7B":
|
117 |
+
final_model = models["7B"]
|
118 |
+
final_tokenizer = tokenizers["7B"]
|
119 |
+
print("\n[7B Model - Final Code Generation] - GPU Accelerated") # Model-specific message
|
120 |
+
model_stage_name = "7B Model - Final Code"
|
121 |
+
final_max_new_tokens = max_new_tokens + 100 # Slightly more tokens for 7B
|
122 |
+
|
123 |
+
elif final_model_size == "14B":
|
124 |
+
final_model = models["14B"]
|
125 |
+
final_tokenizer = tokenizers["14B"]
|
126 |
+
print("\n[14B Model - Final Code Generation] - GPU Accelerated") # Model-specific message
|
127 |
+
model_stage_name = "14B Model - Final Code"
|
128 |
+
final_max_new_tokens = max_new_tokens + 200 # Even more tokens for 14B
|
129 |
+
|
130 |
+
else: # Default to 7B if selection is somehow invalid
|
131 |
+
final_model = models["7B"]
|
132 |
+
final_tokenizer = tokenizers["7B"]
|
133 |
+
print("\n[7B Model - Final Code Generation] - GPU Accelerated (Default)")
|
134 |
+
model_stage_name = "7B Model - Final Code (Default)"
|
135 |
+
final_max_new_tokens = max_new_tokens + 100
|
136 |
+
|
137 |
+
|
138 |
+
retrieved_memory_final = retrieve_from_memory(response_1_5b)
|
139 |
+
context_final = "\n".join([f"- {mem}" for mem in retrieved_memory_final]) if retrieved_memory_final else "No relevant context found in memory."
|
140 |
+
|
141 |
+
# Use user-provided prompt template for final model (currently using 7B prompt for both 7B and 14B for simplicity, you can create a separate 14B prompt if needed)
|
142 |
+
prompt_final = prompt_7b_template.format(response_1_5b=response_1_5b, context_7b=context_final) # Using prompt_7b_template for final stage for now
|
143 |
+
|
144 |
+
|
145 |
+
input_ids_final = final_tokenizer.encode(prompt_final, return_tensors="pt").to(final_model.device)
|
146 |
+
output_final = final_model.generate(
|
147 |
+
input_ids_final,
|
148 |
+
max_new_tokens=final_max_new_tokens,
|
149 |
+
temperature=temperature,
|
150 |
+
top_p=top_p,
|
151 |
do_sample=True
|
152 |
)
|
153 |
+
response_final = final_tokenizer.decode(output_final[0], skip_special_tokens=True)
|
154 |
+
print(f"{model_stage_name} Response:\n{response_final}")
|
155 |
+
store_in_memory(f"{model_stage_name} Response: {response_final[:200]}...")
|
156 |
|
157 |
+
return response_final # Returns final model's response
|
158 |
|
159 |
|
160 |
+
# --- Gradio ChatInterface --- (with Model Selection Dropdown)
|
161 |
+
def gradio_interface(message, history, temp, top_p, max_tokens, prompt_1_5b_text, prompt_7b_text, final_model_selector): # Added final_model_selector
|
162 |
# history is automatically managed by ChatInterface
|
163 |
response = swarm_agent_sequential_rag(
|
164 |
message,
|
165 |
prompt_1_5b_template=prompt_1_5b_text, # Pass prompt templates
|
166 |
prompt_7b_template=prompt_7b_text,
|
167 |
+
final_model_size=final_model_selector, # Pass model selection
|
168 |
temperature=temp,
|
169 |
top_p=top_p,
|
170 |
max_new_tokens=int(max_tokens) # Ensure max_tokens is an integer
|
|
|
173 |
|
174 |
iface = gr.ChatInterface( # Using ChatInterface now
|
175 |
fn=gradio_interface,
|
176 |
+
# Define additional inputs for settings, prompts, and model selection
|
177 |
additional_inputs=[
|
178 |
gr.Slider(minimum=0.1, maximum=1.0, step=0.1, value=0.5, label="Temperature"), # Lowered default temp to 0.5
|
179 |
gr.Slider(minimum=0.01, maximum=1.0, step=0.05, value=0.9, label="Top P"),
|
180 |
gr.Number(value=300, label="Max Tokens", precision=0), # Use Number for integer tokens
|
181 |
gr.Textbox(value=default_prompt_1_5b, lines=10, label="1.5B Model Prompt Template"), # Textbox for 1.5B prompt
|
182 |
gr.Textbox(value=default_prompt_7b, lines=10, label="7B Model Prompt Template"), # Textbox for 7B prompt
|
183 |
+
gr.Dropdown(choices=["7B", "14B"], value="7B", label="Final Stage Model (7B or 14B)") # Model selection dropdown
|
184 |
],
|
185 |
+
title="DeepSeek Agent Swarm Chat (ZeroGPU Demo - 2 Models + Model Swap)", # Updated title
|
186 |
+
description="Chat with a DeepSeek agent swarm (1.5B + 7B/14B selectable) with shared memory, adjustable settings, **customizable prompts, and model swapping!** **GPU accelerated using ZeroGPU!** (Requires Pro Space)", # Updated description
|
187 |
)
|
188 |
|
189 |
if __name__ == "__main__":
|