Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import re | |
| def edit_model_form(model_info): | |
| """Form for editing model metadata""" | |
| st.subheader("Edit Model Information") | |
| if not model_info: | |
| st.error("Model information not found") | |
| return False, None | |
| # Extract model card content (README.md) if available | |
| model_card_content = "" | |
| try: | |
| repo_id = model_info.modelId | |
| model_card_url = f"https://huggingface.co/{repo_id}/raw/main/README.md" | |
| response = st.session_state.client.api._get_paginated(model_card_url) | |
| if response.status_code == 200: | |
| model_card_content = response.text | |
| except Exception as e: | |
| st.warning(f"Couldn't load model card: {str(e)}") | |
| # Extract tags from model card | |
| tags = [] | |
| if model_card_content: | |
| # Look for tags section in YAML frontmatter | |
| yaml_match = re.search(r"---\s+(.*?)\s+---", model_card_content, re.DOTALL) | |
| if yaml_match: | |
| yaml_content = yaml_match.group(1) | |
| tags_match = re.search(r"tags:\s*((?:- .*?\n)+)", yaml_content, re.DOTALL) | |
| if tags_match: | |
| tags_content = tags_match.group(1) | |
| tags = [ | |
| line.strip("- \n") | |
| for line in tags_content.split("\n") | |
| if line.strip().startswith("-") | |
| ] | |
| # Extract description (first paragraph after the title) | |
| description = "" | |
| if model_card_content: | |
| # Find content after title and before next heading | |
| title_match = re.search( | |
| r"# .*?\n\n(.*?)(?=\n## |\Z)", model_card_content, re.DOTALL | |
| ) | |
| if title_match: | |
| description = title_match.group(1).strip() | |
| with st.form("edit_model_form"): | |
| # Model tags | |
| st.markdown("#### Model Tags") | |
| available_tags = st.session_state.client.get_model_tags() | |
| selected_tags = st.multiselect( | |
| "Select tags for your model", | |
| options=available_tags, | |
| default=tags, | |
| help="Tags help others discover your model", | |
| ) | |
| # Model description | |
| st.markdown("#### Description") | |
| updated_description = st.text_area( | |
| "Provide a brief description of your model", | |
| value=description, | |
| help="This will appear on your model card and help others understand your model's purpose", | |
| ) | |
| # Full model card content (for advanced users) | |
| st.markdown("#### Full Model Card (Markdown)") | |
| st.markdown( | |
| "Edit the full model card content if needed. This is in Markdown format." | |
| ) | |
| updated_model_card = st.text_area( | |
| "Model Card Content", value=model_card_content, height=300 | |
| ) | |
| # Submit button | |
| submitted = st.form_submit_button( | |
| "Update Model Information", use_container_width=True | |
| ) | |
| if submitted: | |
| # Update the model card | |
| with st.spinner("Updating model information..."): | |
| try: | |
| repo_id = model_info.modelId | |
| # If the user has edited the full model card, use that | |
| if updated_model_card != model_card_content: | |
| new_content = updated_model_card | |
| else: | |
| # Otherwise, update only tags and description in the existing card | |
| # Update tags in YAML frontmatter | |
| if yaml_match: | |
| yaml_content = yaml_match.group(1) | |
| if tags_match: | |
| # Replace tags section | |
| new_yaml = yaml_content.replace( | |
| tags_match.group(0), | |
| f"tags:\n" | |
| + "\n".join([f"- {tag}" for tag in selected_tags]) | |
| + "\n", | |
| ) | |
| else: | |
| # Add tags section | |
| new_yaml = ( | |
| yaml_content | |
| + f"\ntags:\n" | |
| + "\n".join([f"- {tag}" for tag in selected_tags]) | |
| + "\n" | |
| ) | |
| new_content = model_card_content.replace( | |
| yaml_match.group(0), f"---\n{new_yaml}---" | |
| ) | |
| else: | |
| # Add YAML frontmatter with tags | |
| tags_yaml = ( | |
| "---\ntags:\n" | |
| + "\n".join([f"- {tag}" for tag in selected_tags]) | |
| + "\n---\n\n" | |
| ) | |
| new_content = tags_yaml + model_card_content | |
| # Update description | |
| if title_match and updated_description != description: | |
| new_content = new_content.replace( | |
| title_match.group(0), | |
| title_match.group(0).replace( | |
| description, updated_description | |
| ), | |
| ) | |
| # Update the model card | |
| success, _ = st.session_state.client.update_model_card( | |
| repo_id, new_content | |
| ) | |
| if success: | |
| st.success("Model information updated successfully!") | |
| # Refresh the models list | |
| st.session_state.models = ( | |
| st.session_state.client.get_user_models() | |
| ) | |
| return True, repo_id | |
| else: | |
| st.error("Failed to update model information") | |
| return False, None | |
| except Exception as e: | |
| st.error(f"Error updating model information: {str(e)}") | |
| return False, None | |
| return False, None | |