akhaliq HF Staff commited on
Commit
de52671
·
1 Parent(s): 948839e

update transformer js followup

Browse files
Files changed (1) hide show
  1. app.py +166 -3
app.py CHANGED
@@ -192,6 +192,64 @@ Removing the paragraph...
192
  {REPLACE_END}
193
  ```"""
194
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  # Available models
196
  AVAILABLE_MODELS = [
197
  {
@@ -575,6 +633,83 @@ def apply_search_replace_changes(original_content: str, changes_text: str) -> st
575
 
576
  return modified_content
577
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
578
  # Updated for faster Tavily search and closer prompt usage
579
  # Uses 'advanced' search_depth and auto_parameters=True for speed and relevance
580
 
@@ -1103,13 +1238,19 @@ def generation_code(query: Optional[str], image: Optional[gr.Image], file: Optio
1103
  'import gradio' in last_assistant_msg or
1104
  'import streamlit' in last_assistant_msg or
1105
  'def ' in last_assistant_msg and 'app' in last_assistant_msg or
1106
- 'IMPORTED PROJECT FROM HUGGING FACE SPACE' in last_assistant_msg):
 
 
 
1107
  has_existing_content = True
1108
 
1109
  # Choose system prompt based on context
1110
  if has_existing_content:
1111
  # Use follow-up prompt for modifying existing content
1112
- system_prompt = FollowUpSystemPrompt
 
 
 
1113
  else:
1114
  # Use language-specific prompt
1115
  if language == "html":
@@ -1182,12 +1323,22 @@ This will help me create a better design for you."""
1182
  if language == "transformers.js":
1183
  files = parse_transformers_js_output(content)
1184
  if files['index.html'] and files['index.js'] and files['style.css']:
 
1185
  formatted_output = format_transformers_js_output(files)
1186
  yield {
1187
  code_output: gr.update(value=formatted_output, language="html"),
1188
  history_output: history_to_chatbot_messages(_history),
1189
  sandbox: send_to_sandbox(files['index.html']) if files['index.html'] else "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your code using the download button above.</div>",
1190
  }
 
 
 
 
 
 
 
 
 
1191
  else:
1192
  # Still streaming, show partial content
1193
  yield {
@@ -1229,6 +1380,7 @@ This will help me create a better design for you."""
1229
  # Handle transformers.js output
1230
  files = parse_transformers_js_output(content)
1231
  if files['index.html'] and files['index.js'] and files['style.css']:
 
1232
  formatted_output = format_transformers_js_output(files)
1233
  _history.append([query, formatted_output])
1234
  yield {
@@ -1237,6 +1389,17 @@ This will help me create a better design for you."""
1237
  sandbox: send_to_sandbox(files['index.html']),
1238
  history_output: history_to_chatbot_messages(_history),
1239
  }
 
 
 
 
 
 
 
 
 
 
 
1240
  else:
1241
  # Fallback if parsing failed
1242
  _history.append([query, content])
@@ -1583,7 +1746,7 @@ with gr.Blocks(
1583
  code_output = gr.Code(
1584
  language="html",
1585
  lines=25,
1586
- interactive=False,
1587
  label="Generated code"
1588
  )
1589
  with gr.Tab("Preview"):
 
192
  {REPLACE_END}
193
  ```"""
194
 
195
+ # Follow-up system prompt for modifying existing transformers.js applications
196
+ TransformersJSFollowUpSystemPrompt = f"""You are an expert web developer modifying an existing transformers.js application.
197
+ The user wants to apply changes based on their request.
198
+ You MUST output ONLY the changes required using the following SEARCH/REPLACE block format. Do NOT output the entire file.
199
+ Explain the changes briefly *before* the blocks if necessary, but the code changes THEMSELVES MUST be within the blocks.
200
+
201
+ The transformers.js application consists of three files: index.html, index.js, and style.css.
202
+ When making changes, specify which file you're modifying by starting your search/replace blocks with the file name.
203
+
204
+ Format Rules:
205
+ 1. Start with {SEARCH_START}
206
+ 2. Provide the exact lines from the current code that need to be replaced.
207
+ 3. Use {DIVIDER} to separate the search block from the replacement.
208
+ 4. Provide the new lines that should replace the original lines.
209
+ 5. End with {REPLACE_END}
210
+ 6. You can use multiple SEARCH/REPLACE blocks if changes are needed in different parts of the file.
211
+ 7. To insert code, use an empty SEARCH block (only {SEARCH_START} and {DIVIDER} on their lines) if inserting at the very beginning, otherwise provide the line *before* the insertion point in the SEARCH block and include that line plus the new lines in the REPLACE block.
212
+ 8. To delete code, provide the lines to delete in the SEARCH block and leave the REPLACE block empty (only {DIVIDER} and {REPLACE_END} on their lines).
213
+ 9. IMPORTANT: The SEARCH block must *exactly* match the current code, including indentation and whitespace.
214
+
215
+ Example Modifying HTML:
216
+ ```
217
+ Changing the title in index.html...
218
+ {SEARCH_START}
219
+ <title>Old Title</title>
220
+ {DIVIDER}
221
+ <title>New Title</title>
222
+ {REPLACE_END}
223
+ ```
224
+
225
+ Example Modifying JavaScript:
226
+ ```
227
+ Adding a new function to index.js...
228
+ {SEARCH_START}
229
+ // Existing code
230
+ {DIVIDER}
231
+ // Existing code
232
+
233
+ function newFunction() {{
234
+ console.log("New function added");
235
+ }}
236
+ {REPLACE_END}
237
+ ```
238
+
239
+ Example Modifying CSS:
240
+ ```
241
+ Changing background color in style.css...
242
+ {SEARCH_START}
243
+ body {{
244
+ background-color: white;
245
+ }}
246
+ {DIVIDER}
247
+ body {{
248
+ background-color: #f0f0f0;
249
+ }}
250
+ {REPLACE_END}
251
+ ```"""
252
+
253
  # Available models
254
  AVAILABLE_MODELS = [
255
  {
 
633
 
634
  return modified_content
635
 
636
+ def apply_transformers_js_search_replace_changes(original_formatted_content: str, changes_text: str) -> str:
637
+ """Apply search/replace changes to transformers.js formatted content (three files)"""
638
+ if not changes_text.strip():
639
+ return original_formatted_content
640
+
641
+ # Parse the original formatted content to get the three files
642
+ files = parse_transformers_js_output(original_formatted_content)
643
+
644
+ # Split the changes text into individual search/replace blocks
645
+ blocks = []
646
+ current_block = ""
647
+ lines = changes_text.split('\n')
648
+
649
+ for line in lines:
650
+ if line.strip() == SEARCH_START:
651
+ if current_block.strip():
652
+ blocks.append(current_block.strip())
653
+ current_block = line + '\n'
654
+ elif line.strip() == REPLACE_END:
655
+ current_block += line + '\n'
656
+ blocks.append(current_block.strip())
657
+ current_block = ""
658
+ else:
659
+ current_block += line + '\n'
660
+
661
+ if current_block.strip():
662
+ blocks.append(current_block.strip())
663
+
664
+ # Process each block and apply changes to the appropriate file
665
+ for block in blocks:
666
+ if not block.strip():
667
+ continue
668
+
669
+ # Parse the search/replace block
670
+ lines = block.split('\n')
671
+ search_lines = []
672
+ replace_lines = []
673
+ in_search = False
674
+ in_replace = False
675
+ target_file = None
676
+
677
+ for line in lines:
678
+ if line.strip() == SEARCH_START:
679
+ in_search = True
680
+ in_replace = False
681
+ elif line.strip() == DIVIDER:
682
+ in_search = False
683
+ in_replace = True
684
+ elif line.strip() == REPLACE_END:
685
+ in_replace = False
686
+ elif in_search:
687
+ search_lines.append(line)
688
+ elif in_replace:
689
+ replace_lines.append(line)
690
+
691
+ # Determine which file this change targets based on the search content
692
+ if search_lines:
693
+ search_text = '\n'.join(search_lines).strip()
694
+ replace_text = '\n'.join(replace_lines).strip()
695
+
696
+ # Check which file contains the search text
697
+ if search_text in files['index.html']:
698
+ target_file = 'index.html'
699
+ elif search_text in files['index.js']:
700
+ target_file = 'index.js'
701
+ elif search_text in files['style.css']:
702
+ target_file = 'style.css'
703
+
704
+ # Apply the change to the target file
705
+ if target_file and search_text in files[target_file]:
706
+ files[target_file] = files[target_file].replace(search_text, replace_text)
707
+ else:
708
+ print(f"Warning: Search text not found in any transformers.js file: {search_text[:100]}...")
709
+
710
+ # Reformat the modified files
711
+ return format_transformers_js_output(files)
712
+
713
  # Updated for faster Tavily search and closer prompt usage
714
  # Uses 'advanced' search_depth and auto_parameters=True for speed and relevance
715
 
 
1238
  'import gradio' in last_assistant_msg or
1239
  'import streamlit' in last_assistant_msg or
1240
  'def ' in last_assistant_msg and 'app' in last_assistant_msg or
1241
+ 'IMPORTED PROJECT FROM HUGGING FACE SPACE' in last_assistant_msg or
1242
+ '=== index.html ===' in last_assistant_msg or
1243
+ '=== index.js ===' in last_assistant_msg or
1244
+ '=== style.css ===' in last_assistant_msg):
1245
  has_existing_content = True
1246
 
1247
  # Choose system prompt based on context
1248
  if has_existing_content:
1249
  # Use follow-up prompt for modifying existing content
1250
+ if language == "transformers.js":
1251
+ system_prompt = TransformersJSFollowUpSystemPrompt
1252
+ else:
1253
+ system_prompt = FollowUpSystemPrompt
1254
  else:
1255
  # Use language-specific prompt
1256
  if language == "html":
 
1323
  if language == "transformers.js":
1324
  files = parse_transformers_js_output(content)
1325
  if files['index.html'] and files['index.js'] and files['style.css']:
1326
+ # Model returned complete transformers.js output
1327
  formatted_output = format_transformers_js_output(files)
1328
  yield {
1329
  code_output: gr.update(value=formatted_output, language="html"),
1330
  history_output: history_to_chatbot_messages(_history),
1331
  sandbox: send_to_sandbox(files['index.html']) if files['index.html'] else "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your code using the download button above.</div>",
1332
  }
1333
+ elif has_existing_content:
1334
+ # Model is returning search/replace changes for transformers.js - apply them
1335
+ last_content = _history[-1][1] if _history and len(_history[-1]) > 1 else ""
1336
+ modified_content = apply_transformers_js_search_replace_changes(last_content, content)
1337
+ yield {
1338
+ code_output: gr.update(value=modified_content, language="html"),
1339
+ history_output: history_to_chatbot_messages(_history),
1340
+ sandbox: send_to_sandbox(parse_transformers_js_output(modified_content)['index.html']) if parse_transformers_js_output(modified_content)['index.html'] else "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your code using the download button above.</div>",
1341
+ }
1342
  else:
1343
  # Still streaming, show partial content
1344
  yield {
 
1380
  # Handle transformers.js output
1381
  files = parse_transformers_js_output(content)
1382
  if files['index.html'] and files['index.js'] and files['style.css']:
1383
+ # Model returned complete transformers.js output
1384
  formatted_output = format_transformers_js_output(files)
1385
  _history.append([query, formatted_output])
1386
  yield {
 
1389
  sandbox: send_to_sandbox(files['index.html']),
1390
  history_output: history_to_chatbot_messages(_history),
1391
  }
1392
+ elif has_existing_content:
1393
+ # Model returned search/replace changes for transformers.js - apply them
1394
+ last_content = _history[-1][1] if _history and len(_history[-1]) > 1 else ""
1395
+ modified_content = apply_transformers_js_search_replace_changes(last_content, content)
1396
+ _history.append([query, modified_content])
1397
+ yield {
1398
+ code_output: modified_content,
1399
+ history: _history,
1400
+ sandbox: send_to_sandbox(parse_transformers_js_output(modified_content)['index.html']),
1401
+ history_output: history_to_chatbot_messages(_history),
1402
+ }
1403
  else:
1404
  # Fallback if parsing failed
1405
  _history.append([query, content])
 
1746
  code_output = gr.Code(
1747
  language="html",
1748
  lines=25,
1749
+ interactive=True,
1750
  label="Generated code"
1751
  )
1752
  with gr.Tab("Preview"):