baconnier commited on
Commit
4e9c5bd
1 Parent(s): ad2df9a

Upload 8 files

Browse files
Files changed (3) hide show
  1. app.py +219 -48
  2. custom_css.py +322 -117
  3. prompt_refiner.py +54 -62
app.py CHANGED
@@ -6,6 +6,10 @@ from custom_css import custom_css
6
  class GradioInterface:
7
  def __init__(self, prompt_refiner: PromptRefiner, custom_css):
8
  self.prompt_refiner = prompt_refiner
 
 
 
 
9
  with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as self.interface:
10
  # CONTAINER 1
11
  with gr.Column(elem_classes=["container", "title-container"]):
@@ -15,13 +19,16 @@ class GradioInterface:
15
 
16
  # CONTAINER 2
17
  with gr.Column(elem_classes=["container", "input-container"]):
18
- prompt_text = gr.Textbox(label="Type your prompt (or leave empty to see metaprompt)",lines=5)
19
- automatic_metaprompt_button = gr.Button("Automatic Choice for Refinement Method ")
20
- #with gr.Row(elem_classes=["container2"]):
21
- MetaPrompt_analysis = gr.Markdown()
 
 
 
 
22
 
23
  # CONTAINER 3
24
- # with gr.Column(elem_classes=["container"]):
25
  with gr.Column(elem_classes=["container","meta-container"]):
26
  meta_prompt_choice = gr.Radio(
27
  choices=metaprompt_list,
@@ -29,17 +36,16 @@ class GradioInterface:
29
  value=metaprompt_list[0],
30
  elem_classes=["no-background", "radio-group"]
31
  )
32
- refine_button = gr.Button("Refine Prompt")
 
 
 
33
  with gr.Accordion("Metaprompt Explanation", open=False, visible=True):
34
- gr.Markdown(explanation_markdown)
35
- gr.Examples(
36
- examples=examples,
37
- inputs=[prompt_text, meta_prompt_choice]
38
- )
39
 
40
  with gr.Column(elem_classes=["container", "analysis-container"]):
41
  gr.Markdown(" ")
42
- prompt_evaluation = gr.Markdown() # Added this component
43
  gr.Markdown("### Refined Prompt")
44
  refined_prompt = gr.Textbox(
45
  label=" ",
@@ -47,58 +53,192 @@ class GradioInterface:
47
  show_label=True,
48
  show_copy_button=True,
49
  )
50
- #gr.Markdown("### Explanation of Refinements")
51
  explanation_of_refinements = gr.Markdown()
52
 
53
-
54
  with gr.Column(elem_classes=["container", "model-container"]):
55
  with gr.Row():
56
  apply_model = gr.Dropdown(
57
  choices=models,
58
- value=models[0] if models else None,
59
  label="Choose the Model",
60
  container=False,
61
  scale=1,
62
  min_width=300
63
  )
64
- apply_button = gr.Button("Apply Prompts")
 
 
 
65
 
66
  gr.Markdown("### Prompts on Chosen Model")
67
- with gr.Tabs():
68
- with gr.TabItem("Original Prompt Output"):
69
- original_output = gr.Markdown()
70
- with gr.TabItem("Refined Prompt Output"):
71
- refined_output = gr.Markdown()
72
-
73
- with gr.Accordion("Full Response JSON", open=False, visible=True):
74
- full_response_json = gr.JSON()
75
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  # Button click handlers
77
  automatic_metaprompt_button.click(
78
  fn=self.automatic_metaprompt,
79
  inputs=[prompt_text],
80
  outputs=[MetaPrompt_analysis, meta_prompt_choice]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  )
82
 
83
  refine_button.click(
84
  fn=self.refine_prompt,
85
  inputs=[prompt_text, meta_prompt_choice],
86
- outputs=[
87
- prompt_evaluation,
88
- refined_prompt,
89
- explanation_of_refinements,
90
- full_response_json
91
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  )
93
 
94
  apply_button.click(
95
  fn=self.apply_prompts,
96
  inputs=[prompt_text, refined_prompt, apply_model],
97
- outputs=[original_output, refined_output]
98
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
- gr.HTML(
101
- "<p style='text-align: center; color:orange;'>⚠ This space is in progress, and we're actively working on it, so you might find some bugs! Please report any issues you have in the Community tab to help us make it better for all.</p>"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  )
103
 
104
  def automatic_metaprompt(self, prompt: str) -> tuple:
@@ -118,12 +258,7 @@ class GradioInterface:
118
  """Handle manual prompt refinement"""
119
  try:
120
  if not prompt.strip():
121
- return (
122
- "No prompt provided.",
123
- "",
124
- "",
125
- {}
126
- )
127
 
128
  result = self.prompt_refiner.refine_prompt(prompt, meta_prompt_choice)
129
  return (
@@ -139,16 +274,52 @@ class GradioInterface:
139
  def apply_prompts(self, original_prompt: str, refined_prompt: str, model: str) -> tuple:
140
  """Apply both original and refined prompts to the selected model"""
141
  try:
142
- if not original_prompt.strip() or not refined_prompt.strip():
143
- return "No prompt provided.", "No prompt provided."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
- original_output = self.prompt_refiner.apply_prompt(original_prompt, model)
146
- refined_output = self.prompt_refiner.apply_prompt(refined_prompt, model)
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
- return original_output, refined_output
149
  except Exception as e:
150
- error_message = f"Error applying prompts: {str(e)}"
151
- return error_message, error_message
152
 
153
  def launch(self, share=False):
154
  """Launch the Gradio interface"""
 
6
  class GradioInterface:
7
  def __init__(self, prompt_refiner: PromptRefiner, custom_css):
8
  self.prompt_refiner = prompt_refiner
9
+ # Set default model to second-to-last in the list
10
+ default_model = models[-1] if len(models) >= 1 else models[0] if models else None
11
+ #meta_prompt_choice=metaprompt_list[0]
12
+
13
  with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as self.interface:
14
  # CONTAINER 1
15
  with gr.Column(elem_classes=["container", "title-container"]):
 
19
 
20
  # CONTAINER 2
21
  with gr.Column(elem_classes=["container", "input-container"]):
22
+ prompt_text = gr.Textbox(label="Type your prompt (or leave empty to see metaprompt)",lines=5)
23
+ with gr.Accordion("Prompt Examples", open=False, visible=True):
24
+ gr.Examples(examples=examples,inputs=[prompt_text])
25
+ automatic_metaprompt_button = gr.Button(
26
+ "Automatic Choice for Refinement Method",
27
+ elem_classes=["button-highlight"]
28
+ )
29
+ MetaPrompt_analysis = gr.Markdown()
30
 
31
  # CONTAINER 3
 
32
  with gr.Column(elem_classes=["container","meta-container"]):
33
  meta_prompt_choice = gr.Radio(
34
  choices=metaprompt_list,
 
36
  value=metaprompt_list[0],
37
  elem_classes=["no-background", "radio-group"]
38
  )
39
+ refine_button = gr.Button(
40
+ "Refine Prompt",
41
+ elem_classes=["button-waiting"]
42
+ )
43
  with gr.Accordion("Metaprompt Explanation", open=False, visible=True):
44
+ gr.Markdown(explanation_markdown)
 
 
 
 
45
 
46
  with gr.Column(elem_classes=["container", "analysis-container"]):
47
  gr.Markdown(" ")
48
+ prompt_evaluation = gr.Markdown()
49
  gr.Markdown("### Refined Prompt")
50
  refined_prompt = gr.Textbox(
51
  label=" ",
 
53
  show_label=True,
54
  show_copy_button=True,
55
  )
 
56
  explanation_of_refinements = gr.Markdown()
57
 
 
58
  with gr.Column(elem_classes=["container", "model-container"]):
59
  with gr.Row():
60
  apply_model = gr.Dropdown(
61
  choices=models,
62
+ value=default_model,
63
  label="Choose the Model",
64
  container=False,
65
  scale=1,
66
  min_width=300
67
  )
68
+ apply_button = gr.Button(
69
+ "Apply Prompts",
70
+ elem_classes=["button-waiting"]
71
+ )
72
 
73
  gr.Markdown("### Prompts on Chosen Model")
74
+ with gr.Tabs(elem_classes=["tabs"]):
75
+ with gr.TabItem("Prompts Output Comparison", elem_classes=["tabitem"]):
76
+ with gr.Row(elem_classes=["output-row"]):
77
+ with gr.Column(scale=1, elem_classes=["comparison-column"]):
78
+ gr.Markdown("### Original Prompt Output")
79
+ original_output1 = gr.Markdown(
80
+ # value="Output will appear here",
81
+ elem_classes=["output-content"],
82
+ visible=True
83
+ )
84
+ with gr.Column(scale=1, elem_classes=["comparison-column"]):
85
+ gr.Markdown("### Refined Prompt Output")
86
+ refined_output1 = gr.Markdown(
87
+ # value="Output will appear here",
88
+ elem_classes=["output-content"],
89
+ visible=True
90
+ )
91
+ with gr.TabItem("Original Prompt Output", elem_classes=["tabitem"]):
92
+ with gr.Row(elem_classes=["output-row"]):
93
+ with gr.Column(scale=1, elem_classes=["comparison-column"]):
94
+ gr.Markdown("### Original Prompt Output")
95
+ original_output = gr.Markdown(
96
+ # value="Output will appear here",
97
+ elem_classes=[ "output-content"],
98
+ visible=True
99
+ )
100
+ with gr.TabItem("Refined Prompt Output", elem_classes=["tabitem"]):
101
+ with gr.Row(elem_classes=["output-row"]):
102
+ with gr.Column(scale=1, elem_classes=["comparison-column"]):
103
+ gr.Markdown("### Refined Prompt Output")
104
+ refined_output = gr.Markdown(
105
+ # value="Output will appear here",
106
+ elem_classes=["output-content"],
107
+ visible=True
108
+ )
109
+
110
+ with gr.Accordion("Full Response JSON", open=False, visible=True):
111
+ full_response_json = gr.JSON()
112
+
113
  # Button click handlers
114
  automatic_metaprompt_button.click(
115
  fn=self.automatic_metaprompt,
116
  inputs=[prompt_text],
117
  outputs=[MetaPrompt_analysis, meta_prompt_choice]
118
+ ).then(
119
+ fn=lambda: None,
120
+ inputs=None,
121
+ outputs=None,
122
+ js="""
123
+ () => {
124
+ // Clear subsequent outputs
125
+ document.querySelectorAll('.analysis-container textarea, .analysis-container .markdown-text, .model-container .markdown-text, .comparison-output').forEach(el => {
126
+ if (el.value !== undefined) {
127
+ el.value = '';
128
+ } else {
129
+ el.textContent = '';
130
+ }
131
+ });
132
+
133
+ // Update button states
134
+ const allButtons = Array.from(document.querySelectorAll('button')).filter(btn =>
135
+ btn.textContent.includes('Automatic Choice') ||
136
+ btn.textContent.includes('Refine Prompt') ||
137
+ btn.textContent.includes('Apply Prompts')
138
+ );
139
+ allButtons.forEach(btn => btn.classList.remove('button-highlight'));
140
+ allButtons[1].classList.add('button-highlight'); // Highlight refine button
141
+ allButtons[0].classList.add('button-completed'); // Complete current button
142
+ allButtons[2].classList.add('button-waiting'); // Set apply button to waiting
143
+ }
144
+ """
145
  )
146
 
147
  refine_button.click(
148
  fn=self.refine_prompt,
149
  inputs=[prompt_text, meta_prompt_choice],
150
+ outputs=[prompt_evaluation, refined_prompt, explanation_of_refinements, full_response_json]
151
+ ).then(
152
+ fn=lambda: None,
153
+ inputs=None,
154
+ outputs=None,
155
+ js="""
156
+ () => {
157
+ // Clear model outputs
158
+ document.querySelectorAll('.model-container .markdown-text, .comparison-output').forEach(el => {
159
+ if (el.value !== undefined) {
160
+ el.value = '';
161
+ } else {
162
+ el.textContent = '';
163
+ }
164
+ });
165
+
166
+ // Update button states
167
+ const allButtons = Array.from(document.querySelectorAll('button')).filter(btn =>
168
+ btn.textContent.includes('Automatic Choice') ||
169
+ btn.textContent.includes('Refine Prompt') ||
170
+ btn.textContent.includes('Apply Prompts')
171
+ );
172
+ allButtons.forEach(btn => btn.classList.remove('button-highlight'));
173
+ allButtons[2].classList.add('button-highlight'); // Highlight apply button
174
+ allButtons[1].classList.add('button-completed'); // Complete current button
175
+ allButtons[2].classList.remove('button-waiting'); // Remove waiting from apply button
176
+ }
177
+ """
178
  )
179
 
180
  apply_button.click(
181
  fn=self.apply_prompts,
182
  inputs=[prompt_text, refined_prompt, apply_model],
183
+ outputs=[original_output, refined_output, original_output1, refined_output1],
184
+ show_progress=True # Add this line
185
+ ).then(
186
+ fn=lambda: None,
187
+ inputs=None,
188
+ outputs=None,
189
+ js="""
190
+ () => {
191
+ // Update button states
192
+ const allButtons = Array.from(document.querySelectorAll('button')).filter(btn =>
193
+ btn.textContent.includes('Automatic Choice') ||
194
+ btn.textContent.includes('Refine Prompt') ||
195
+ btn.textContent.includes('Apply Prompts')
196
+ );
197
+ allButtons.forEach(btn => btn.classList.remove('button-highlight', 'button-waiting'));
198
+ allButtons[2].classList.add('button-completed'); // Complete apply button
199
+
200
+ // Force refresh of output containers
201
+ document.querySelectorAll('.comparison-output').forEach(el => {
202
+ if (el.parentElement) {
203
+ el.parentElement.style.display = 'none';
204
+ setTimeout(() => {
205
+ el.parentElement.style.display = 'block';
206
+ }, 100);
207
+ }
208
+ });
209
+ }
210
+ """
211
+ )
212
 
213
+ # Reset when input changes
214
+ prompt_text.change(
215
+ fn=lambda: None,
216
+ inputs=None,
217
+ outputs=None,
218
+ js="""
219
+ () => {
220
+ // Clear all outputs
221
+ document.querySelectorAll('.analysis-container textarea, .analysis-container .markdown-text, .model-container .markdown-text, .comparison-output').forEach(el => {
222
+ if (el.value !== undefined) {
223
+ el.value = '';
224
+ } else {
225
+ el.textContent = '';
226
+ }
227
+ });
228
+
229
+ // Reset all button states
230
+ const allButtons = Array.from(document.querySelectorAll('button')).filter(btn =>
231
+ btn.textContent.includes('Automatic Choice') ||
232
+ btn.textContent.includes('Refine Prompt') ||
233
+ btn.textContent.includes('Apply Prompts')
234
+ );
235
+ allButtons.forEach(btn => {
236
+ btn.classList.remove('button-completed', 'button-highlight', 'button-waiting');
237
+ });
238
+ allButtons[0].classList.add('button-highlight'); // Highlight first button
239
+ allButtons.slice(1).forEach(btn => btn.classList.add('button-waiting')); // Set subsequent buttons to waiting
240
+ }
241
+ """
242
  )
243
 
244
  def automatic_metaprompt(self, prompt: str) -> tuple:
 
258
  """Handle manual prompt refinement"""
259
  try:
260
  if not prompt.strip():
261
+ return ("No prompt provided.", "", "", {})
 
 
 
 
 
262
 
263
  result = self.prompt_refiner.refine_prompt(prompt, meta_prompt_choice)
264
  return (
 
274
  def apply_prompts(self, original_prompt: str, refined_prompt: str, model: str) -> tuple:
275
  """Apply both original and refined prompts to the selected model"""
276
  try:
277
+ if not original_prompt or not refined_prompt:
278
+ return ("Please provide both original and refined prompts.",
279
+ "Please provide both original and refined prompts.",
280
+ "Please provide both original and refined prompts.",
281
+ "Please provide both original and refined prompts.")
282
+
283
+ if not model:
284
+ return ("Please select a model.",
285
+ "Please select a model.",
286
+ "Please select a model.",
287
+ "Please select a model.")
288
+
289
+ # Apply prompts and get outputs
290
+ try:
291
+ # print(original_prompt)
292
+ # print(refined_prompt)
293
+ #print(model)
294
+
295
+ original_output = self.prompt_refiner.apply_prompt(original_prompt, model)
296
+ #print(original_output)
297
+ refined_output = self.prompt_refiner.apply_prompt(refined_prompt, model)
298
+ except Exception as e:
299
+ return (f"Error applying prompts: {str(e)}",
300
+ f"Error applying prompts: {str(e)}",
301
+ f"Error applying prompts: {str(e)}",
302
+ f"Error applying prompts: {str(e)}")
303
 
304
+ # Ensure we have string outputs
305
+ original_output = str(original_output) if original_output is not None else "No output generated"
306
+ refined_output = str(refined_output) if refined_output is not None else "No output generated"
307
+ print('-'*100)
308
+ print(original_output)
309
+ print('-'*100)
310
+ print(refined_output)
311
+ print('-'*100)
312
+
313
+ return (
314
+ original_output, # For Original Prompt Output tab
315
+ refined_output, # For Refined Prompt Output tab
316
+ original_output, # For Comparison tab - original
317
+ refined_output # For Comparison tab - refined
318
+ )
319
 
 
320
  except Exception as e:
321
+ error_message = f"Error in apply_prompts: {str(e)}"
322
+ return (error_message, error_message, error_message, error_message)
323
 
324
  def launch(self, share=False):
325
  """Launch the Gradio interface"""
custom_css.py CHANGED
@@ -1,177 +1,382 @@
 
1
  custom_css = """
 
 
 
 
 
2
  .container {
3
- border: 2px solid #2196F3;
4
- border-radius: 10px;
5
- padding: 12px;
6
- margin: 6px;
7
- background: white;
8
- position: relative;
9
- width: 100% !important;
10
- max-width: 1200px !important;
11
- margin: 0 auto 20px auto !important;
12
  }
13
 
 
14
  .container::before {
15
- position: absolute;
16
- top: -14px;
17
- left: 20px;
18
- background: white;
19
- padding: 0 10px;
20
- color: #2196F3;
21
- font-weight: bold;
22
- font-size: 1.2em;
23
  }
24
 
 
 
 
 
 
25
  .title-container {
26
- width: fit-content !important;
27
- margin: 0 auto !important;
28
- padding: 2px 40px !important;
29
- border: 1px solid #0066cc !important;
30
- border-radius: 10px !important;
31
- background-color: rgba(0, 102, 204, 0.05) !important;
 
32
  }
33
 
 
34
  .title-container * {
35
- text-align: center;
36
- margin: 0 !important;
37
- line-height: 1.2 !important;
38
  }
39
 
 
40
  .title-container h1 {
41
- font-size: 28px !important;
42
- margin-bottom: 1px !important;
43
  }
44
 
 
45
  .title-container h3 {
46
- font-size: 18px !important;
47
- margin-bottom: 1px !important;
48
  }
49
 
 
50
  .title-container p {
51
- font-size: 14px !important;
52
- margin-bottom: 1px !important;
53
- }
54
-
55
- .input-container::before {
56
- content: 'PROMPT ANALYSIS';
57
  }
58
 
59
- .analysis-container::before {
60
- content: 'PROMPT REFINEMENT';
61
- }
62
-
63
- .meta-container::before {
64
- content: 'REFINEMENT METHOD';
65
- }
 
 
 
66
 
67
- .model-container::before {
68
- content: 'PROMPTS APPLICATION';
69
- }
70
-
71
- .examples-container::before {
72
- content: 'EXAMPLES';
73
- }
74
-
75
- /* Resizable textbox */
76
  .input-container textarea {
77
- resize: vertical !important;
78
- min-height: 100px !important;
79
- max-height: 500px !important;
80
- width: 100% !important;
81
- border: 1px solid #ddd !important;
82
- border-radius: 4px !important;
83
- padding: 8px !important;
84
- transition: all 0.3s ease !important;
85
  }
86
 
 
87
  .input-container textarea:focus {
88
- border-color: #2196F3 !important;
89
- box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1) !important;
90
  }
91
 
92
- /* Radio group styling */
 
 
 
 
93
  .radio-group {
94
- background-color: rgba(0, 102, 204, 0.05) !important;
95
- padding: 10px !important;
96
- border-radius: 8px !important;
97
- border: 1px solid rgba(0, 102, 204, 0.1) !important;
98
- display: flex !important;
99
- justify-content: center !important;
100
- flex-wrap: wrap !important;
101
- gap: 8px !important;
102
- width: 100% !important;
103
  }
104
 
 
105
  .gradio-radio {
106
- display: flex !important;
107
- justify-content: center !important;
108
- flex-wrap: wrap !important;
109
- gap: 8px !important;
110
  }
111
 
 
112
  .gradio-radio label {
113
- display: flex !important;
114
- align-items: center !important;
115
- padding: 6px 12px !important;
116
- border: 1px solid #ddd !important;
117
- border-radius: 4px !important;
118
- cursor: pointer !important;
119
- background: white !important;
120
- margin: 4px !important;
121
  }
122
 
 
123
  .gradio-radio input[type="radio"]:checked + label {
124
- background: rgba(0, 102, 204, 0.1) !important;
125
- border-color: #0066cc !important;
126
- color: #0066cc !important;
127
- font-weight: bold !important;
128
  }
129
 
130
- /* Button styling */
 
 
 
 
131
  .gradio-button {
132
- background-color: white !important;
133
- color: #2196F3 !important;
134
- border: 2px solid #2196F3 !important;
135
- border-radius: 4px !important;
136
- padding: 8px 16px !important;
137
- margin: 10px 0 !important;
138
- font-weight: bold !important;
139
- transition: all 0.3s ease !important;
140
  }
141
 
 
142
  .gradio-button:hover {
143
- background-color: #2196F3 !important;
144
- color: white !important;
145
- box-shadow: 0 2px 5px rgba(33, 150, 243, 0.3) !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  }
147
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  /* Accordion styling */
149
  .gradio-accordion {
150
- margin: 10px 0 !important;
151
- border: none !important;
152
  }
153
 
154
- /* Container alignment */
155
  .gradio-container {
156
- display: flex !important;
157
- flex-direction: column !important;
158
- align-items: center !important;
159
- width: 100% !important;
160
- max-width: 1200px !important;
161
- margin: 0 auto !important;
162
  }
163
 
164
- /* Dropdown styling */
165
  .gradio-dropdown {
166
- width: 100% !important;
167
- max-width: 300px !important;
168
  }
169
 
170
- /* JSON container */
171
  .full-response-json {
172
- margin-top: 20px !important;
173
- padding: 10px !important;
174
- background-color: rgba(0, 102, 204, 0.05) !important;
175
- border-radius: 8px !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  }
177
  """
 
1
+
2
  custom_css = """
3
+ /* ============================================
4
+ MAIN LAYOUT AND CONTAINERS
5
+ Purpose: Core layout structure with minimal spacing
6
+ ============================================ */
7
+ /* Main container styling with blue border and rounded corners */
8
  .container {
9
+ border: 2px solid #2196F3; /* Blue border with 2px thickness */
10
+ border-radius: 10px; /* Rounded corners */
11
+ padding: 10px !important; /* Inner spacing */
12
+ margin: 2px auto !important; /* Outer spacing and center alignment */
13
+ background: white; /* White background */
14
+ position: relative; /* For absolute positioning of children */
15
+ width: 100% !important; /* Full width */
16
+ max-width: 1200px !important; /* Maximum width constraint */
 
17
  }
18
 
19
+ /* Section header label positioning and styling */
20
  .container::before {
21
+ position: absolute; /* Position independently */
22
+ top: -18px; /* Negative top margin to overlap container border */
23
+ left: 20px; /* Left offset */
24
+ background: white; /* White background for text */
25
+ padding: 0 2px; /* Horizontal padding*/
26
+ color: #2196F3; /* Blue text color */
27
+ font-weight: bold; /* Bold text */
28
+ font-size: 1.2em; /* Larger text size */
29
  }
30
 
31
+ /* ============================================
32
+ TITLE SECTION
33
+ Purpose: "Prompts on Chosen Model" header styling
34
+ ============================================ */
35
+ /* Title container styling */
36
  .title-container {
37
+ width: fit-content !important; /* Width based on content */
38
+ margin: 0 auto !important; /* Center alignment */
39
+ margin-bottom: 30px !important; /* Adjust the value (30px) as needed */
40
+ padding: 2px 40px !important; /* Horizontal padding */
41
+ border: 1px solid #0066cc !important; /* Blue border */
42
+ border-radius: 10px !important; /* Rounded corners */
43
+ background-color: rgba(0, 102, 204, 0.05) !important; /* Light blue background */
44
  }
45
 
46
+ /* Center align all text in title container */
47
  .title-container * {
48
+ text-align: center; /* Center text alignment */
49
+ margin: 0 !important; /* Remove margins */
50
+ line-height: 1.2 !important; /* Line height for readability */
51
  }
52
 
53
+ /* Main title styling */
54
  .title-container h1 {
55
+ font-size: 28px !important; /* Large font size */
56
+ margin-bottom: 1px !important; /* Small bottom margin */
57
  }
58
 
59
+ /* Subtitle styling */
60
  .title-container h3 {
61
+ font-size: 18px !important; /* Medium font size */
62
+ margin-bottom: 1px !important; /* Small bottom margin */
63
  }
64
 
65
+ /* Paragraph text styling in title */
66
  .title-container p {
67
+ font-size: 14px !important; /* Regular font size */
68
+ margin-bottom: 1px !important; /* Small bottom margin */
 
 
 
 
69
  }
70
 
71
+ /* ============================================
72
+ SECTION LABELS
73
+ Purpose: Section header text content
74
+ ============================================ */
75
+ /* Define text content for each section header */
76
+ .input-container::before { content: 'PROMPT ANALYSIS'; }
77
+ .analysis-container::before { content: 'PROMPT REFINEMENT'; }
78
+ .meta-container::before { content: 'REFINEMENT METHOD'; }
79
+ .model-container::before { content: 'PROMPTS APPLICATION'; }
80
+ .examples-container::before { content: 'EXAMPLES'; }
81
 
82
+ /* ============================================
83
+ INPUT ELEMENTS
84
+ Purpose: Textarea and input styling
85
+ ============================================ */
86
+ /* Textarea styling */
 
 
 
 
87
  .input-container textarea {
88
+ resize: vertical !important; /* Allow vertical resizing only */
89
+ min-height: 100px !important; /* Minimum height */
90
+ max-height: 500px !important; /* Maximum height */
91
+ width: 100% !important; /* Full width */
92
+ border: 1px solid #ddd !important; /* Light gray border */
93
+ border-radius: 4px !important; /* Rounded corners */
94
+ padding: 2px !important; /* Inner spacing */
95
+ transition: all 0.3s ease !important; /* Smooth transitions */
96
  }
97
 
98
+ /* Textarea focus state */
99
  .input-container textarea:focus {
100
+ border-color: #2196F3 !important; /* Blue border when focused */
101
+ box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1) !important; /* Subtle shadow */
102
  }
103
 
104
+ /* ============================================
105
+ RADIO BUTTONS
106
+ Purpose: Selection options styling
107
+ ============================================ */
108
+ /* Radio button group container */
109
  .radio-group {
110
+ background-color: rgba(0, 102, 204, 0.05) !important; /* Light blue background */
111
+ padding: 10px !important; /* Inner spacing */
112
+ border-radius: 8px !important; /* Rounded corners */
113
+ border: 1px solid rgba(0, 102, 204, 0.1) !important; /* Light blue border */
114
+ display: flex !important; /* Flex layout */
115
+ justify-content: center !important; /* Center items */
116
+ flex-wrap: wrap !important; /* Allow wrapping */
117
+ gap: 8px !important; /* Space between items */
118
+ width: 100% !important; /* Full width */
119
  }
120
 
121
+ /* Radio button container */
122
  .gradio-radio {
123
+ display: flex !important; /* Flex layout */
124
+ justify-content: center !important; /* Center items */
125
+ flex-wrap: wrap !important; /* Allow wrapping */
126
+ gap: 8px !important; /* Space between items */
127
  }
128
 
129
+ /* Radio button label styling */
130
  .gradio-radio label {
131
+ display: flex !important; /* Flex layout */
132
+ align-items: center !important; /* Center vertically */
133
+ padding: 6px 12px !important; /* Inner spacing */
134
+ border: 1px solid #ddd !important; /* Light gray border */
135
+ border-radius: 4px !important; /* Rounded corners */
136
+ cursor: pointer !important; /* Pointer cursor */
137
+ background: white !important; /* White background */
138
+ margin: 4px !important; /* Outer spacing */
139
  }
140
 
141
+ /* Selected radio button styling */
142
  .gradio-radio input[type="radio"]:checked + label {
143
+ background: rgba(0, 102, 204, 0.1) !important; /* Light blue background */
144
+ border-color: #0066cc !important; /* Blue border */
145
+ color: #0066cc !important; /* Blue text */
146
+ font-weight: bold !important; /* Bold text */
147
  }
148
 
149
+ /* ============================================
150
+ BUTTONS
151
+ Purpose: Interactive button styling
152
+ ============================================ */
153
+ /* Base button styling */
154
  .gradio-button {
155
+ background-color: white !important; /* White background */
156
+ color: #2196F3 !important; /* Blue text */
157
+ border: 2px solid #2196F3 !important; /* Blue border */
158
+ border-radius: 4px !important; /* Rounded corners */
159
+ padding: 8px 16px !important; /* Inner spacing */
160
+ margin: 10px 0 !important; /* Vertical margin */
161
+ font-weight: bold !important; /* Bold text */
162
+ transition: all 0.3s ease !important; /* Smooth transitions */
163
  }
164
 
165
+ /* Button hover state */
166
  .gradio-button:hover {
167
+ background-color: #2196F3 !important; /* Blue background on hover */
168
+ color: white !important; /* White text on hover */
169
+ box-shadow: 0 2px 5px rgba(33, 150, 243, 0.3) !important; /* Shadow effect */
170
+ }
171
+
172
+ /* Highlighted button state */
173
+ .button-highlight {
174
+ animation: pulse 2s infinite; /* Pulsing animation */
175
+ border-color: #ff9800 !important; /* Orange border */
176
+ border-width: 3px !important; /* Thicker border */
177
+ box-shadow: 0 0 10px rgba(255, 152, 0, 0.5) !important; /* Glow effect */
178
+ }
179
+
180
+ /* Pulsing animation keyframes */
181
+ @keyframes pulse {
182
+ 0% { box-shadow: 0 0 0 0 rgba(255, 152, 0, 0.4); } /* Start state */
183
+ 70% { box-shadow: 0 0 0 10px rgba(255, 152, 0, 0); } /* Mid state */
184
+ 100% { box-shadow: 0 0 0 0 rgba(255, 152, 0, 0); } /* End state */
185
  }
186
 
187
+ /* Waiting button state */
188
+ .button-waiting {
189
+ opacity: 0.6 !important; /* Reduced opacity */
190
+ }
191
+
192
+ /* Completed button state */
193
+ .button-completed {
194
+ border-color: #4CAF50 !important; /* Green border */
195
+ background-color: rgba(76, 175, 80, 0.1) !important; /* Light green background */
196
+ }
197
+
198
+ /* ============================================
199
+ LAYOUT COMPONENTS
200
+ Purpose: Basic layout element styling
201
+ ============================================ */
202
  /* Accordion styling */
203
  .gradio-accordion {
204
+ margin: 10px 0 !important; /* Vertical margin */
205
+ border: none !important; /* Remove border */
206
  }
207
 
208
+ /* Main container layout */
209
  .gradio-container {
210
+ display: flex !important; /* Flex layout */
211
+ flex-direction: column !important; /* Stack vertically */
212
+ align-items: center !important; /* Center items */
213
+ width: 100% !important; /* Full width */
214
+ max-width: 1200px !important; /* Maximum width */
215
+ margin: 2px auto !important; /* Center horizontally */
216
  }
217
 
218
+ /* Dropdown menu styling */
219
  .gradio-dropdown {
220
+ width: 100% !important; /* Full width */
221
+ max-width: 300px !important; /* Maximum width */
222
  }
223
 
224
+ /* JSON response container */
225
  .full-response-json {
226
+ margin-top: 20px !important; /* Top margin */
227
+ padding: 10px !important; /* Inner spacing */
228
+ background-color: rgba(0, 102, 204, 0.05) !important; /* Light blue background */
229
+ border-radius: 8px !important; /* Rounded corners */
230
+ }
231
+
232
+ /* ============================================
233
+ COMPARISON COLUMNS
234
+ Purpose: Side-by-side output display
235
+ ============================================ */
236
+ /* Column container styling */
237
+ .comparison-column {
238
+ border: 2px solid #2196F3 !important; /* Blue border */
239
+ border-radius: 8px !important; /* Rounded corners */
240
+ padding: 4px !important; /* Inner spacing */
241
+ margin: 1px !important; /* Minimal margin */
242
+ background-color: white !important; /* White background */
243
+ flex: 1 !important; /* Equal width columns */
244
+ min-width: 300px !important; /* Minimum width */
245
+ padding-right: 2px !important; /* Add this to remove right padding */
246
+ margin-right: 2px !important; /* Add this to remove right margin */
247
+ }
248
+
249
+ /* Column header styling */
250
+ .comparison-column h3 {
251
+ color: #2196F3 !important; /* Blue text */
252
+ border-bottom: 1px solid #e0e0e0 !important; /* Bottom border */
253
+ padding-bottom: 2px !important; /* Bottom padding */
254
+ margin: 0 0 4px 0 !important; /* Bottom margin */
255
+ font-size: 16px !important; /* Font size */
256
+ text-align: center !important; /* Center text */
257
+ }
258
+
259
+ /* Output area styling */
260
+ .comparison-output {
261
+ min-height: 200px !important; /* Minimum height */
262
+ padding: 6px !important; /* Inner spacing */
263
+ background-color: #f8f9fa !important; /* Light gray background */
264
+ border: 1px solid #dee2e6 !important; /* Gray border */
265
+ border-radius: 4px !important; /* Rounded corners */
266
+ margin: 4px 0 !important; /* Vertical margin */
267
+ white-space: pre-wrap !important; /* Preserve whitespace */
268
+ word-wrap: break-word !important; /* Break long words */
269
+ font-family: monospace !important; /* Monospace font */
270
+ line-height: 1.5 !important; /* Line height */
271
+ overflow-y: auto !important; /* Vertical scroll */
272
+ width: 100% !important; /* Full width */
273
+ visibility: visible !important; /* Always visible */
274
+ opacity: 1 !important; /* Full opacity */
275
+ padding: 10px 3px !important; /* 20px top/bottom, 30px left/right */
276
+ }
277
+
278
+ /* ============================================
279
+ OUTPUT ROW
280
+ Purpose: Layout for output display
281
+ ============================================ */
282
+ /* Output row container */
283
+ .output-row {
284
+ display: flex !important; /* Flex layout */
285
+ gap: 1mm !important; /* Small gap between items */
286
+ padding: 2mm !important; /* Inner spacing */
287
+ width: 100% !important; /* Full width */
288
+ flex-wrap: wrap !important; /* Allow wrapping */
289
+ }
290
+
291
+ /* ============================================
292
+ TABS
293
+ Purpose: Tab navigation styling
294
+ ============================================ */
295
+ /* Tab container */
296
+ .tabs {
297
+ border: none !important; /* Remove border */
298
+ margin-top: 4px !important; /* Top margin */
299
+ width: 100% !important; /* Full width */
300
+ }
301
+
302
+ /* Individual tab item */
303
+ .tabitem {
304
+ padding: 4px !important; /* Inner spacing */
305
+ width: 100% !important; /* Full width */
306
+ }
307
+
308
+ /* ============================================
309
+ TEXT CONTENT
310
+ Purpose: Text display formatting
311
+ ============================================ */
312
+ /* Markdown text styling */
313
+ .markdown-text {
314
+ color: #333333 !important; /* Dark gray text */
315
+ line-height: 1.6 !important; /* Line height */
316
+ font-size: 14px !important; /* Font size */
317
+ margin: 4px 4px !important; /* Vertical margin */
318
+ opacity: 1 !important; /* Full opacity */
319
+ visibility: visible !important; /* Always visible */
320
+ padding: 15px !important;
321
+ }
322
+
323
+ /* Placeholder text for empty output */
324
+ .comparison-output:empty::before {
325
+ content: 'Output will appear here' !important; /* Placeholder text */
326
+ color: #666666 !important; /* Gray text */
327
+ font-style: italic !important; /* Italic style */
328
+ }
329
+
330
+ /* ============================================
331
+ BUTTON STATES
332
+ Purpose: Button interaction styling
333
+ ============================================ */
334
+ /* Default button state */
335
+ button {
336
+ opacity: 1 !important; /* Full opacity */
337
+ pointer-events: auto !important; /* Enable interactions */
338
+ }
339
+
340
+ /* Disabled button state */
341
+ button:disabled {
342
+ opacity: 0.6 !important; /* Reduced opacity */
343
+ pointer-events: none !important; /* Disable interactions */
344
+ }
345
+
346
+ /* ============================================
347
+ VISIBILITY
348
+ Purpose: Element display control
349
+ ============================================ */
350
+ /* Output content visibility */
351
+ .output-content {
352
+ opacity: 1 !important; /* Full opacity */
353
+ visibility: visible !important; /* Always visible */
354
+ display: block !important; /* Block display */
355
+ }
356
+
357
+ /* Output container visibility */
358
+ .output-container {
359
+ display: block !important; /* Block display */
360
+ visibility: visible !important; /* Always visible */
361
+ opacity: 1 !important; /* Full opacity */
362
+ }
363
+
364
+ /* ============================================
365
+ CODE BLOCKS
366
+ Purpose: Code and pre-formatted text styling
367
+ ============================================ */
368
+ /* Code block styling */
369
+ pre, code {
370
+ background-color: #f8f9fa !important; /* Light gray background */
371
+ border: 1px solid #dee2e6 !important; /* Gray border */
372
+ border-radius: 4px !important; /* Rounded corners */
373
+ padding: 10px !important; /* Inner spacing */
374
+ margin: 5px 0 !important; /* Vertical margin */
375
+ white-space: pre-wrap !important; /* Preserve whitespace */
376
+ word-wrap: break-word !important; /* Break long words */
377
+ font-family: monospace !important; /* Monospace font */
378
+ line-height: 1.5 !important; /* Line height */
379
+ display: block !important; /* Block display */
380
+ width: 100% !important; /* Full width */
381
  }
382
  """
prompt_refiner.py CHANGED
@@ -55,13 +55,13 @@ class PromptRefiner:
55
  if isinstance(parsed_json, str):
56
  parsed_json = json.loads(parsed_json)
57
  prompt_analysis = f"""
58
- #### Original prompt analysis
59
- - {parsed_json.get("initial_prompt_evaluation", "")}
60
- """
61
  explanation_of_refinements=f"""
62
- #### Refinement Explanation
63
- - {parsed_json.get("explanation_of_refinements", "")}
64
- """
65
  return {
66
  "initial_prompt_evaluation": prompt_analysis,
67
  "refined_prompt": parsed_json.get("refined_prompt", ""),
@@ -124,40 +124,39 @@ class PromptRefiner:
124
  "content": metaprompt_router.replace("[Insert initial prompt here]", prompt)
125
  }
126
  ]
127
-
128
  router_response = self.client.chat_completion(
129
  model=prompt_refiner_model,
130
  messages=router_messages,
131
  max_tokens=3000,
132
  temperature=0.2
133
  )
134
-
135
  router_content = router_response.choices[0].message.content.strip()
136
  json_match = re.search(r'<json>(.*?)</json>', router_content, re.DOTALL)
137
 
138
  if not json_match:
139
  raise ValueError("No JSON found in router response")
140
-
141
  router_result = json.loads(json_match.group(1))
142
  recommended_key = router_result["recommended_metaprompt"]["key"]
143
  metaprompt_analysis = f"""
144
- #### Selected MetaPrompt
145
- - **Primary Choice**: {router_result["recommended_metaprompt"]["name"]}
146
- - *Description*: {router_result["recommended_metaprompt"]["description"]}
147
- - *Why This Choice*: {router_result["recommended_metaprompt"]["explanation"]}
148
- - *Similar Sample*: {router_result["recommended_metaprompt"]["similar_sample"]}
149
- - *Customized Sample*: {router_result["recommended_metaprompt"]["customized_sample"]}
150
-
151
- #### Alternative Option
152
- - **Secondary Choice**: {router_result["alternative_recommendation"]["name"]}
153
- - *Why Consider This*: {router_result["alternative_recommendation"]["explanation"]}
154
  """
155
 
156
  return metaprompt_analysis, recommended_key
157
-
158
  except Exception as e:
159
  return f"Error in automatic metaprompt: {str(e)}", ""
160
-
161
 
162
  def refine_prompt(self, prompt: str, meta_prompt_choice: str) -> Tuple[str, str, str, dict]:
163
  """Refine the given prompt using the selected meta prompt."""
@@ -175,14 +174,14 @@ class PromptRefiner:
175
  "content": selected_meta_prompt.replace("[Insert initial prompt here]", prompt)
176
  }
177
  ]
178
-
179
  response = self.client.chat_completion(
180
  model=prompt_refiner_model,
181
  messages=messages,
182
  max_tokens=3000,
183
  temperature=0.8
184
  )
185
-
186
  result = self._parse_response(response.choices[0].message.content.strip())
187
  llm_response = LLMResponse(**result)
188
  llm_response_dico={}
@@ -196,7 +195,7 @@ class PromptRefiner:
196
  llm_response.explanation_of_refinements,
197
  llm_response_dico
198
  )
199
-
200
  except Exception as e:
201
  return (
202
  f"Error: {str(e)}",
@@ -205,42 +204,35 @@ class PromptRefiner:
205
  {}
206
  )
207
 
208
- def _create_error_response(self, error_message: str) -> Tuple[str, str, str, str, dict]:
209
- """Create a standardized error response tuple."""
210
- return (
211
- # f"Error: {error_message}",
212
- f"Error: {error_message}",
213
- "The selected model is currently unavailable.",
214
- "An error occurred during processing.",
215
- {"error": error_message}
216
- )
217
-
218
  def apply_prompt(self, prompt: str, model: str) -> str:
219
- """Apply formatting to the prompt using the specified model."""
220
- try:
221
- messages = [
222
- {
223
- "role": "system",
224
- "content": "You are a markdown formatting expert."
225
- },
226
- {
227
- "role": "user",
228
- "content": prompt
229
- }
230
- ]
231
-
232
- response = self.client.chat_completion(
233
- model=model,
234
- messages=messages,
235
- max_tokens=3000,
236
- temperature=0.8,
237
- stream=True
238
- )
239
-
240
- return "".join(
241
- chunk.choices[0].delta.content or ""
242
- for chunk in response
243
- ).strip()
244
-
245
- except Exception as e:
246
- return f"Error: {str(e)}"
 
 
 
 
55
  if isinstance(parsed_json, str):
56
  parsed_json = json.loads(parsed_json)
57
  prompt_analysis = f"""
58
+ #### Original prompt analysis
59
+ - {parsed_json.get("initial_prompt_evaluation", "")}
60
+ """
61
  explanation_of_refinements=f"""
62
+ #### Refinement Explanation
63
+ - {parsed_json.get("explanation_of_refinements", "")}
64
+ """
65
  return {
66
  "initial_prompt_evaluation": prompt_analysis,
67
  "refined_prompt": parsed_json.get("refined_prompt", ""),
 
124
  "content": metaprompt_router.replace("[Insert initial prompt here]", prompt)
125
  }
126
  ]
127
+
128
  router_response = self.client.chat_completion(
129
  model=prompt_refiner_model,
130
  messages=router_messages,
131
  max_tokens=3000,
132
  temperature=0.2
133
  )
134
+
135
  router_content = router_response.choices[0].message.content.strip()
136
  json_match = re.search(r'<json>(.*?)</json>', router_content, re.DOTALL)
137
 
138
  if not json_match:
139
  raise ValueError("No JSON found in router response")
140
+
141
  router_result = json.loads(json_match.group(1))
142
  recommended_key = router_result["recommended_metaprompt"]["key"]
143
  metaprompt_analysis = f"""
144
+ #### Selected MetaPrompt
145
+ - **Primary Choice**: {router_result["recommended_metaprompt"]["name"]}
146
+ - *Description*: {router_result["recommended_metaprompt"]["description"]}
147
+ - *Why This Choice*: {router_result["recommended_metaprompt"]["explanation"]}
148
+ - *Similar Sample*: {router_result["recommended_metaprompt"]["similar_sample"]}
149
+ - *Customized Sample*: {router_result["recommended_metaprompt"]["customized_sample"]}
150
+
151
+ #### Alternative Option
152
+ - **Secondary Choice**: {router_result["alternative_recommendation"]["name"]}
153
+ - *Why Consider This*: {router_result["alternative_recommendation"]["explanation"]}
154
  """
155
 
156
  return metaprompt_analysis, recommended_key
157
+
158
  except Exception as e:
159
  return f"Error in automatic metaprompt: {str(e)}", ""
 
160
 
161
  def refine_prompt(self, prompt: str, meta_prompt_choice: str) -> Tuple[str, str, str, dict]:
162
  """Refine the given prompt using the selected meta prompt."""
 
174
  "content": selected_meta_prompt.replace("[Insert initial prompt here]", prompt)
175
  }
176
  ]
177
+
178
  response = self.client.chat_completion(
179
  model=prompt_refiner_model,
180
  messages=messages,
181
  max_tokens=3000,
182
  temperature=0.8
183
  )
184
+
185
  result = self._parse_response(response.choices[0].message.content.strip())
186
  llm_response = LLMResponse(**result)
187
  llm_response_dico={}
 
195
  llm_response.explanation_of_refinements,
196
  llm_response_dico
197
  )
198
+
199
  except Exception as e:
200
  return (
201
  f"Error: {str(e)}",
 
204
  {}
205
  )
206
 
 
 
 
 
 
 
 
 
 
 
207
  def apply_prompt(self, prompt: str, model: str) -> str:
208
+ """Apply formatting to the prompt using the specified model."""
209
+ try:
210
+ if not prompt or not model:
211
+ return "Error: Prompt and model are required"
212
+
213
+ messages = [
214
+ {
215
+ "role": "system",
216
+ "content": "You are a markdown formatting expert."
217
+ },
218
+ {
219
+ "role": "user",
220
+ "content": prompt
221
+ }
222
+ ]
223
+
224
+ response = self.client.chat_completion(
225
+ model=model,
226
+ messages=messages,
227
+ max_tokens=3000,
228
+ temperature=0.8,
229
+ stream=False # Mode non-stream
230
+ )
231
+
232
+ # Accès direct à la réponse puisque stream=False
233
+ result = response.choices[0].message.content.strip()
234
+ return f"""{result}"""
235
+
236
+
237
+ except Exception as e:
238
+ return f"Error: {str(e)}"