Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -131,10 +131,12 @@ for category, models in MODEL_CATEGORIES.items():
|
|
| 131 |
ALL_MODELS.extend(models)
|
| 132 |
|
| 133 |
|
| 134 |
-
# Helper function to get model info display
|
| 135 |
def get_model_info(model_name):
|
| 136 |
"""Extract and format model information for display"""
|
| 137 |
parts = model_name.split('/')
|
|
|
|
|
|
|
|
|
|
| 138 |
org = parts[0]
|
| 139 |
model = parts[1]
|
| 140 |
|
|
@@ -146,6 +148,20 @@ def get_model_info(model_name):
|
|
| 146 |
return f"**Organization:** {org}\n**Model:** {model}\n**Size:** {size}"
|
| 147 |
|
| 148 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
def filter_models(search_term):
|
| 150 |
"""Filter models based on search term across all categories"""
|
| 151 |
if not search_term:
|
|
@@ -164,18 +180,48 @@ def update_model_display(search_term=""):
|
|
| 164 |
"""Update the model selection UI based on search term"""
|
| 165 |
filtered_categories = filter_models(search_term)
|
| 166 |
|
| 167 |
-
# Create HTML for model display
|
| 168 |
-
html = "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
|
|
|
|
| 170 |
for category, models in filtered_categories.items():
|
| 171 |
html += f"<h3>{category}</h3><div style='display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px;'>"
|
| 172 |
|
| 173 |
for model in models:
|
| 174 |
model_short = model.split('/')[-1]
|
|
|
|
| 175 |
html += f"""
|
| 176 |
-
<div class='model-card'
|
| 177 |
style='border: 1px solid #ddd; border-radius: 8px; padding: 12px; cursor: pointer; transition: all 0.2s;
|
| 178 |
-
background: linear-gradient(145deg, #f0f0f0, #ffffff); box-shadow: 0 4px 6px rgba(0,0,0,0.1);'
|
|
|
|
| 179 |
<div style='font-weight: bold; margin-bottom: 6px; color: #1a73e8;'>{model_short}</div>
|
| 180 |
<div style='font-size: 0.8em; color: #666;'>{model.split('/')[0]}</div>
|
| 181 |
</div>
|
|
@@ -185,25 +231,7 @@ def update_model_display(search_term=""):
|
|
| 185 |
if not filtered_categories:
|
| 186 |
html += "<p>No models found matching your search.</p>"
|
| 187 |
|
| 188 |
-
html += "
|
| 189 |
-
<script>
|
| 190 |
-
function selectAndUpdateModel(model) {
|
| 191 |
-
// Set the value in the input field
|
| 192 |
-
const input = document.getElementById('custom-model-input');
|
| 193 |
-
input.value = model;
|
| 194 |
-
|
| 195 |
-
// Create and dispatch a change event to trigger Gradio's handlers
|
| 196 |
-
const event = new Event('change', { bubbles: true });
|
| 197 |
-
input.dispatchEvent(event);
|
| 198 |
-
|
| 199 |
-
// Also trigger the input event for good measure
|
| 200 |
-
const inputEvent = new Event('input', { bubbles: true });
|
| 201 |
-
input.dispatchEvent(inputEvent);
|
| 202 |
-
|
| 203 |
-
console.log('Model selected:', model);
|
| 204 |
-
}
|
| 205 |
-
</script>"""
|
| 206 |
-
|
| 207 |
return html
|
| 208 |
|
| 209 |
|
|
@@ -325,7 +353,7 @@ with gr.Blocks(css=custom_css, title=APP_TITLE, theme=gr.themes.Soft()) as demo:
|
|
| 325 |
|
| 326 |
# Model information display
|
| 327 |
gr.HTML("<h4>Current Model Info</h4>")
|
| 328 |
-
model_info_display = gr.Markdown(get_model_info("Qwen/Qwen3-32B"))
|
| 329 |
gr.HTML("</div>")
|
| 330 |
|
| 331 |
with gr.Column(scale=3):
|
|
@@ -412,6 +440,9 @@ with gr.Blocks(css=custom_css, title=APP_TITLE, theme=gr.themes.Soft()) as demo:
|
|
| 412 |
</div>
|
| 413 |
""")
|
| 414 |
|
|
|
|
|
|
|
|
|
|
| 415 |
# Set up event handlers
|
| 416 |
msg.submit(
|
| 417 |
fn=respond,
|
|
@@ -446,9 +477,16 @@ with gr.Blocks(css=custom_css, title=APP_TITLE, theme=gr.themes.Soft()) as demo:
|
|
| 446 |
|
| 447 |
# Update model info when selection changes
|
| 448 |
custom_model_box.change(
|
| 449 |
-
fn=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 450 |
inputs=custom_model_box,
|
| 451 |
-
outputs=model_info_display
|
| 452 |
)
|
| 453 |
|
| 454 |
if __name__ == "__main__":
|
|
|
|
| 131 |
ALL_MODELS.extend(models)
|
| 132 |
|
| 133 |
|
|
|
|
| 134 |
def get_model_info(model_name):
|
| 135 |
"""Extract and format model information for display"""
|
| 136 |
parts = model_name.split('/')
|
| 137 |
+
if len(parts) != 2:
|
| 138 |
+
return f"**Model:** {model_name}\n**Format:** Unknown"
|
| 139 |
+
|
| 140 |
org = parts[0]
|
| 141 |
model = parts[1]
|
| 142 |
|
|
|
|
| 148 |
return f"**Organization:** {org}\n**Model:** {model}\n**Size:** {size}"
|
| 149 |
|
| 150 |
|
| 151 |
+
def set_model_and_update_info(model_name):
|
| 152 |
+
"""Set the selected model and update the model info display"""
|
| 153 |
+
# This function is called when a model is selected (either clicked or via API)
|
| 154 |
+
try:
|
| 155 |
+
# Get model info
|
| 156 |
+
model_info = get_model_info(model_name)
|
| 157 |
+
|
| 158 |
+
# Return both the model name and the model info
|
| 159 |
+
return model_name, model_info
|
| 160 |
+
except Exception as e:
|
| 161 |
+
print(f"Error in set_model_and_update_info: {e}")
|
| 162 |
+
return model_name, f"**Error loading model info**: {str(e)}"
|
| 163 |
+
|
| 164 |
+
|
| 165 |
def filter_models(search_term):
|
| 166 |
"""Filter models based on search term across all categories"""
|
| 167 |
if not search_term:
|
|
|
|
| 180 |
"""Update the model selection UI based on search term"""
|
| 181 |
filtered_categories = filter_models(search_term)
|
| 182 |
|
| 183 |
+
# Create HTML for model display with a more direct approach
|
| 184 |
+
html = """
|
| 185 |
+
<div style='max-height: 400px; overflow-y: auto;'>
|
| 186 |
+
<script>
|
| 187 |
+
// Direct model selection function - more reliable
|
| 188 |
+
function selectModel(modelName) {
|
| 189 |
+
// Get the textbox element by its ID
|
| 190 |
+
const modelInput = document.getElementById('custom-model-input');
|
| 191 |
+
if (modelInput) {
|
| 192 |
+
// Set the value
|
| 193 |
+
modelInput.value = modelName;
|
| 194 |
+
|
| 195 |
+
// Create and dispatch change event
|
| 196 |
+
const event = new Event('change', { bubbles: true });
|
| 197 |
+
modelInput.dispatchEvent(event);
|
| 198 |
+
|
| 199 |
+
// Look for the hidden trigger button and click it
|
| 200 |
+
const triggerBtn = document.querySelector('button[value="Select Model"]');
|
| 201 |
+
if (triggerBtn) {
|
| 202 |
+
triggerBtn.click();
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
console.log('Selected model:', modelName);
|
| 206 |
+
} else {
|
| 207 |
+
console.error('Model input element not found');
|
| 208 |
+
}
|
| 209 |
+
}
|
| 210 |
+
</script>
|
| 211 |
+
"""
|
| 212 |
|
| 213 |
+
# Add models by category
|
| 214 |
for category, models in filtered_categories.items():
|
| 215 |
html += f"<h3>{category}</h3><div style='display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px;'>"
|
| 216 |
|
| 217 |
for model in models:
|
| 218 |
model_short = model.split('/')[-1]
|
| 219 |
+
escaped_model = model.replace("'", "\\'").replace('"', '\\"')
|
| 220 |
html += f"""
|
| 221 |
+
<div class='model-card'
|
| 222 |
style='border: 1px solid #ddd; border-radius: 8px; padding: 12px; cursor: pointer; transition: all 0.2s;
|
| 223 |
+
background: linear-gradient(145deg, #f0f0f0, #ffffff); box-shadow: 0 4px 6px rgba(0,0,0,0.1);'
|
| 224 |
+
onclick="selectModel('{escaped_model}')">
|
| 225 |
<div style='font-weight: bold; margin-bottom: 6px; color: #1a73e8;'>{model_short}</div>
|
| 226 |
<div style='font-size: 0.8em; color: #666;'>{model.split('/')[0]}</div>
|
| 227 |
</div>
|
|
|
|
| 231 |
if not filtered_categories:
|
| 232 |
html += "<p>No models found matching your search.</p>"
|
| 233 |
|
| 234 |
+
html += "</div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
return html
|
| 236 |
|
| 237 |
|
|
|
|
| 353 |
|
| 354 |
# Model information display
|
| 355 |
gr.HTML("<h4>Current Model Info</h4>")
|
| 356 |
+
model_info_display = gr.Markdown(get_model_info("Qwen/Qwen3-32B"))
|
| 357 |
gr.HTML("</div>")
|
| 358 |
|
| 359 |
with gr.Column(scale=3):
|
|
|
|
| 440 |
</div>
|
| 441 |
""")
|
| 442 |
|
| 443 |
+
# Add a hidden button to trigger model selection via JavaScript
|
| 444 |
+
trigger_model_selection = gr.Button("Select Model", visible=False)
|
| 445 |
+
|
| 446 |
# Set up event handlers
|
| 447 |
msg.submit(
|
| 448 |
fn=respond,
|
|
|
|
| 477 |
|
| 478 |
# Update model info when selection changes
|
| 479 |
custom_model_box.change(
|
| 480 |
+
fn=set_model_and_update_info,
|
| 481 |
+
inputs=custom_model_box,
|
| 482 |
+
outputs=[custom_model_box, model_info_display]
|
| 483 |
+
)
|
| 484 |
+
|
| 485 |
+
# Connect the hidden trigger button to update model info
|
| 486 |
+
trigger_model_selection.click(
|
| 487 |
+
fn=set_model_and_update_info,
|
| 488 |
inputs=custom_model_box,
|
| 489 |
+
outputs=[custom_model_box, model_info_display]
|
| 490 |
)
|
| 491 |
|
| 492 |
if __name__ == "__main__":
|