Navya-Sree commited on
Commit
bc3ba82
·
verified ·
1 Parent(s): f40dfb7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -133
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import os
2
  import glob
 
3
  import streamlit as st
4
  from urllib.parse import urlparse, parse_qs
5
 
@@ -14,6 +15,7 @@ st.set_page_config(page_title="Multi-Agent Codegen (OpenAI)", layout="wide")
14
  st.title("🤖 Multi-Agent Codegen + Review + Testing (OpenAI)")
15
  st.caption("Coder → Reviewer → Tester loop with pytest verification.")
16
 
 
17
  # -----------------------------
18
  # Helpers
19
  # -----------------------------
@@ -60,9 +62,6 @@ def parse_openai_uri(uri: str) -> tuple[str, str, str]:
60
 
61
 
62
  def build_orchestrator(api_key: str, base_url: str, model: str, temperature: float) -> Orchestrator:
63
- if not api_key:
64
- raise RuntimeError("OpenAI key missing. Paste it in the URI field in the sidebar.")
65
-
66
  llm = OpenAIResponsesLLM(
67
  api_key=api_key,
68
  base_url=base_url,
@@ -77,19 +76,16 @@ def build_orchestrator(api_key: str, base_url: str, model: str, temperature: flo
77
 
78
 
79
  # -----------------------------
80
- # Sidebar controls
81
  # -----------------------------
82
  with st.sidebar:
83
- st.header("OpenAI Key")
84
- user_key = st.text_input("Paste OpenAI API Key", type="password", help="Starts with sk-...")
85
- model = st.text_input("Model", value="gpt-5")
86
- temperature = st.slider("Temperature", 0.0, 1.0, 0.2, 0.05)
87
- max_iters = st.slider("Max iterations", 1, 6, 3)
88
 
89
  uri = st.text_input(
90
- "OpenAI URI (paste key here)",
91
  type="password",
92
  value="",
 
93
  help=(
94
  "Paste either:\n"
95
  "• Just the key: sk-...\n"
@@ -98,23 +94,27 @@ with st.sidebar:
98
  ),
99
  )
100
 
101
- api_key, base_url, model_from_uri = parse_openai_uri(uri)
102
 
103
- model = st.text_input("Model", value=model_from_uri)
104
- temperature = st.slider("Temperature", 0.0, 1.0, 0.2, 0.05)
105
- max_iters = st.slider("Max iterations", 1, 6, 3)
 
 
 
 
106
 
107
  st.divider()
108
  st.caption("Debug (optional)")
109
- if st.checkbox("Show import paths / files"):
110
  st.write("PYTHONPATH =", os.getenv("PYTHONPATH"))
111
- st.write("sys.path =", __import__("sys").path)
112
  st.write("/app/src exists?", os.path.exists("/app/src"))
113
  st.write("/app/src/macg exists?", os.path.exists("/app/src/macg"))
114
  st.write("Files in /app/src/macg:", glob.glob("/app/src/macg/*"))
115
 
116
  if not api_key:
117
- st.warning("Paste your OpenAI key in the URI field to run.")
118
 
119
 
120
  # -----------------------------
@@ -129,131 +129,22 @@ default_task = (
129
  "Edge cases: n <= 0 should return an empty list."
130
  )
131
 
132
- task = st.text_area("Task", value=default_task, height=180)
133
 
134
  colA, colB = st.columns([1, 1])
135
- run_btn = colA.button("Run Agents", type="primary", use_container_width=True)
136
- clear_btn = colB.button("Clear Output", use_container_width=True)
137
 
138
  if clear_btn:
139
  st.session_state.pop("result", None)
140
 
141
  if run_btn:
142
- try:
143
- orch = build_orchestrator(api_key=api_key, base_url=base_url, model=model, temperature=temperature)
144
- with st.spinner("Running Coder → Reviewer → Tester..."):
145
- result = orch.run(task=task, max_iters=int(max_iters))
146
- st.session_state["result"] = result
147
- except Exception as e:
148
- st.error(str(e))
149
-
150
- result = st.session_state.get("result")
151
-
152
- if result:
153
- top1, top2, top3 = st.columns([1, 1, 1])
154
- top1.metric("Passed", "✅ Yes" if result.passed else "❌ No")
155
- top2.metric("Iterations", str(result.iteration))
156
- top3.metric("Module", result.module_name)
157
-
158
- st.divider()
159
-
160
- left, right = st.columns([1, 1])
161
-
162
- with left:
163
- st.subheader("Generated Code")
164
- st.code(result.code or "", language="python")
165
-
166
- st.subheader("Review Notes")
167
- st.text(result.review_notes or "")
168
-
169
- with right:
170
- st.subheader("Generated Tests")
171
- st.code(result.tests or "", language="python")
172
-
173
- st.subheader("Test Report")
174
- st.text(result.test_report or "")
175
- import streamlit as st
176
-
177
- from macg.llm_openai import OpenAIResponsesLLM
178
-
179
- openai_key = os.getenv("OPENAI_API_KEY")
180
- if not openai_key:
181
- st.error("OPENAI_API_KEY not found. Add it in HF Space Settings → Variables and secrets.")
182
- st.stop()
183
-
184
- llm = OpenAIResponsesLLM(
185
- model=st.sidebar.text_input("OpenAI model", value="gpt-5"),
186
- api_key=openai_key,
187
- temperature=st.sidebar.slider("Temperature", 0.0, 1.0, 0.2, 0.05),
188
- max_output_tokens=900,
189
- )
190
-
191
- st.set_page_config(page_title="Multi-Agent Codegen (HF)", layout="wide")
192
-
193
- st.title("🤖 Multi-Agent Codegen + Review + Testing (Hugging Face)")
194
- st.caption("Coder → Reviewer → Tester loop with pytest verification.")
195
-
196
- # --- Secrets / token handling (Streamlit Cloud uses st.secrets) ---
197
- hf_token = None
198
- if "HF_TOKEN" in st.secrets:
199
- hf_token = st.secrets["HF_TOKEN"]
200
- else:
201
- hf_token = os.getenv("HF_TOKEN")
202
-
203
- with st.sidebar:
204
- st.header("Settings")
205
- model = st.text_input(
206
- "HF model (Inference API)",
207
- value="Qwen/Qwen2.5-Coder-7B-Instruct",
208
- help="You can change to another hosted model if you want."
209
- )
210
- max_iters = st.slider("Max iterations", 1, 6, 3)
211
- temperature = st.slider("Temperature", 0.0, 1.0, 0.2, 0.05)
212
-
213
- st.divider()
214
- st.subheader("HF Token")
215
- if hf_token:
216
- st.success("HF_TOKEN found (env or secrets).")
217
- else:
218
- st.warning("HF_TOKEN not found. Add it in Streamlit Secrets or environment.")
219
- st.info("Streamlit Cloud: Settings → Secrets → add HF_TOKEN='...'")
220
-
221
- default_task = (
222
- "Implement a function fizzbuzz(n: int) -> list[str] that returns strings for 1..n.\n"
223
- "- Multiples of 3 -> 'Fizz'\n"
224
- "- Multiples of 5 -> 'Buzz'\n"
225
- "- Multiples of both -> 'FizzBuzz'\n"
226
- "Return the list of length n.\n"
227
- "Edge cases: n <= 0 should return an empty list."
228
- )
229
-
230
- task = st.text_area("Task", value=default_task, height=180)
231
-
232
- colA, colB = st.columns([1, 1])
233
- run_btn = colA.button("Run Agents", type="primary", use_container_width=True)
234
- clear_btn = colB.button("Clear Output", use_container_width=True)
235
-
236
- if clear_btn:
237
- st.session_state.pop("result", None)
238
-
239
- def build_orchestrator() -> Orchestrator:
240
- if not hf_token:
241
- raise RuntimeError("HF_TOKEN missing. Add it to environment or Streamlit secrets.")
242
-
243
- llm = HuggingFaceInferenceLLM(
244
- model=model,
245
- token=hf_token,
246
- temperature=float(temperature),
247
- max_new_tokens=900,
248
- )
249
- coder = CoderAgent(llm)
250
- reviewer = ReviewerAgent(llm)
251
- tester = TesterAgent(llm)
252
- return Orchestrator(coder=coder, reviewer=reviewer, tester=tester)
253
 
254
- if run_btn:
255
  try:
256
- orch = build_orchestrator()
257
  with st.spinner("Running Coder → Reviewer → Tester..."):
258
  result = orch.run(task=task, max_iters=int(max_iters))
259
  st.session_state["result"] = result
 
1
  import os
2
  import glob
3
+ import sys
4
  import streamlit as st
5
  from urllib.parse import urlparse, parse_qs
6
 
 
15
  st.title("🤖 Multi-Agent Codegen + Review + Testing (OpenAI)")
16
  st.caption("Coder → Reviewer → Tester loop with pytest verification.")
17
 
18
+
19
  # -----------------------------
20
  # Helpers
21
  # -----------------------------
 
62
 
63
 
64
  def build_orchestrator(api_key: str, base_url: str, model: str, temperature: float) -> Orchestrator:
 
 
 
65
  llm = OpenAIResponsesLLM(
66
  api_key=api_key,
67
  base_url=base_url,
 
76
 
77
 
78
  # -----------------------------
79
+ # Sidebar controls (UNIQUE keys)
80
  # -----------------------------
81
  with st.sidebar:
82
+ st.header("OpenAI Connection")
 
 
 
 
83
 
84
  uri = st.text_input(
85
+ "OpenAI URI / Key (paste here)",
86
  type="password",
87
  value="",
88
+ key="openai_uri_input",
89
  help=(
90
  "Paste either:\n"
91
  "• Just the key: sk-...\n"
 
94
  ),
95
  )
96
 
97
+ api_key_from_uri, base_url, model_from_uri = parse_openai_uri(uri)
98
 
99
+ # Optional fallback to environment if user doesn't paste a key
100
+ api_key_env = os.getenv("OPENAI_API_KEY", "")
101
+ api_key = api_key_from_uri or api_key_env
102
+
103
+ model = st.text_input("Model", value=model_from_uri, key="openai_model_input")
104
+ temperature = st.slider("Temperature", 0.0, 1.0, 0.2, 0.05, key="openai_temp_slider")
105
+ max_iters = st.slider("Max iterations", 1, 6, 3, key="openai_max_iters_slider")
106
 
107
  st.divider()
108
  st.caption("Debug (optional)")
109
+ if st.checkbox("Show import paths / files", key="debug_checkbox"):
110
  st.write("PYTHONPATH =", os.getenv("PYTHONPATH"))
111
+ st.write("sys.path =", sys.path)
112
  st.write("/app/src exists?", os.path.exists("/app/src"))
113
  st.write("/app/src/macg exists?", os.path.exists("/app/src/macg"))
114
  st.write("Files in /app/src/macg:", glob.glob("/app/src/macg/*"))
115
 
116
  if not api_key:
117
+ st.warning("Paste your OpenAI API key (sk-...) in the URI/Key box to run.")
118
 
119
 
120
  # -----------------------------
 
129
  "Edge cases: n <= 0 should return an empty list."
130
  )
131
 
132
+ task = st.text_area("Task", value=default_task, height=180, key="task_textarea")
133
 
134
  colA, colB = st.columns([1, 1])
135
+ run_btn = colA.button("Run Agents", type="primary", use_container_width=True, key="run_agents_btn")
136
+ clear_btn = colB.button("Clear Output", use_container_width=True, key="clear_output_btn")
137
 
138
  if clear_btn:
139
  st.session_state.pop("result", None)
140
 
141
  if run_btn:
142
+ if not api_key:
143
+ st.error("No OpenAI key found. Paste it in the sidebar or set OPENAI_API_KEY as an environment variable.")
144
+ st.stop()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
 
146
  try:
147
+ orch = build_orchestrator(api_key=api_key, base_url=base_url, model=model, temperature=temperature)
148
  with st.spinner("Running Coder → Reviewer → Tester..."):
149
  result = orch.run(task=task, max_iters=int(max_iters))
150
  st.session_state["result"] = result