From 05aba5a311387889075bc7dbd9d2d88adeba1d34 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Sat, 18 Oct 2025 18:17:42 +0200 Subject: [PATCH] chore(gallery agent): add execution summary in the PR message Signed-off-by: Ettore Di Giacinto --- .github/gallery-agent/main.go | 50 ++++++++++++++++++++++++++++ .github/workflows/gallery-agent.yaml | 37 +++++++++++++++++--- 2 files changed, 82 insertions(+), 5 deletions(-) diff --git a/.github/gallery-agent/main.go b/.github/gallery-agent/main.go index 780e50f49..78d3a6cd7 100644 --- a/.github/gallery-agent/main.go +++ b/.github/gallery-agent/main.go @@ -2,10 +2,12 @@ package main import ( "context" + "encoding/json" "fmt" "os" "strconv" "strings" + "time" "github.com/go-skynet/LocalAI/.github/gallery-agent/hfapi" ) @@ -44,7 +46,20 @@ type SearchResult struct { FormattedOutput string `json:"formatted_output"` } +// AddedModelSummary represents a summary of models added to the gallery +type AddedModelSummary struct { + SearchTerm string `json:"search_term"` + TotalFound int `json:"total_found"` + ModelsAdded int `json:"models_added"` + AddedModelIDs []string `json:"added_model_ids"` + AddedModelURLs []string `json:"added_model_urls"` + Quantization string `json:"quantization"` + ProcessingTime string `json:"processing_time"` +} + func main() { + startTime := time.Now() + // Check for synthetic mode syntheticMode := os.Getenv("SYNTHETIC_MODE") if syntheticMode == "true" || syntheticMode == "1" { @@ -126,8 +141,18 @@ func main() { models = models[:maxModelsInt] } + // Track added models for summary + var addedModelIDs []string + var addedModelURLs []string + // Generate YAML entries and append to gallery/index.yaml if len(models) > 0 { + for _, model := range models { + addedModelIDs = append(addedModelIDs, model.ModelID) + // Generate Hugging Face URL for the model + modelURL := fmt.Sprintf("https://huggingface.co/%s", model.ModelID) + addedModelURLs = append(addedModelURLs, modelURL) + } fmt.Println("Generating YAML entries for selected models...") err = generateYAMLForModels(context.Background(), models) if err != nil { @@ -137,6 +162,31 @@ func main() { } else { fmt.Println("No new models to add to the gallery.") } + + // Create and write summary + processingTime := time.Since(startTime).String() + summary := AddedModelSummary{ + SearchTerm: searchTerm, + TotalFound: result.TotalModelsFound, + ModelsAdded: len(addedModelIDs), + AddedModelIDs: addedModelIDs, + AddedModelURLs: addedModelURLs, + Quantization: quantization, + ProcessingTime: processingTime, + } + + // Write summary to file + summaryData, err := json.MarshalIndent(summary, "", " ") + if err != nil { + fmt.Fprintf(os.Stderr, "Error marshaling summary: %v\n", err) + } else { + err = os.WriteFile("gallery-agent-summary.json", summaryData, 0644) + if err != nil { + fmt.Fprintf(os.Stderr, "Error writing summary file: %v\n", err) + } else { + fmt.Printf("Summary written to gallery-agent-summary.json\n") + } + } } func searchAndProcessModels(searchTerm string, limit int, quantization string) (*SearchResult, error) { diff --git a/.github/workflows/gallery-agent.yaml b/.github/workflows/gallery-agent.yaml index 9d2823756..ebed65692 100644 --- a/.github/workflows/gallery-agent.yaml +++ b/.github/workflows/gallery-agent.yaml @@ -72,6 +72,28 @@ jobs: git diff gallery/index.yaml fi + - name: Read gallery agent summary + id: read_summary + if: steps.check_changes.outputs.changes == 'true' + run: | + if [ -f "gallery-agent-summary.json" ]; then + echo "summary_exists=true" >> $GITHUB_OUTPUT + # Extract summary data using jq + echo "search_term=$(jq -r '.search_term' gallery-agent-summary.json)" >> $GITHUB_OUTPUT + echo "total_found=$(jq -r '.total_found' gallery-agent-summary.json)" >> $GITHUB_OUTPUT + echo "models_added=$(jq -r '.models_added' gallery-agent-summary.json)" >> $GITHUB_OUTPUT + echo "quantization=$(jq -r '.quantization' gallery-agent-summary.json)" >> $GITHUB_OUTPUT + echo "processing_time=$(jq -r '.processing_time' gallery-agent-summary.json)" >> $GITHUB_OUTPUT + + # Create a formatted list of added models with URLs + added_models=$(jq -r 'range(0; .added_model_ids | length) as $i | "- [\(.added_model_ids[$i])](\(.added_model_urls[$i]))"' gallery-agent-summary.json | tr '\n' '\n') + echo "added_models<> $GITHUB_OUTPUT + echo "$added_models" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + else + echo "summary_exists=false" >> $GITHUB_OUTPUT + fi + - name: Create Pull Request if: steps.check_changes.outputs.changes == 'true' uses: peter-evans/create-pull-request@v7 @@ -79,16 +101,21 @@ jobs: token: ${{ secrets.UPDATE_BOT_TOKEN }} push-to-fork: ci-forks/LocalAI commit-message: 'chore(model gallery): :robot: add new models via gallery agent' - title: 'chore(model gallery): :robot: add new models via gallery agent' + title: 'chore(model gallery): :robot: add ${{ steps.read_summary.outputs.models_added || 0 }} new models via gallery agent' # Branch has to be unique so PRs are not overriding each other branch-suffix: timestamp body: | This PR was automatically created by the gallery agent workflow. - **Changes:** - - Added new models to the gallery based on search term: `${{ github.event.inputs.search_term || 'GGUF' }}` - - Processed up to `${{ github.event.inputs.limit || '5' }}` models - - Used quantization preference: `${{ github.event.inputs.quantization || 'Q4_K_M' }}` + **Summary:** + - **Search Term:** ${{ steps.read_summary.outputs.search_term || github.event.inputs.search_term || 'GGUF' }} + - **Models Found:** ${{ steps.read_summary.outputs.total_found || 'N/A' }} + - **Models Added:** ${{ steps.read_summary.outputs.models_added || '0' }} + - **Quantization:** ${{ steps.read_summary.outputs.quantization || github.event.inputs.quantization || 'Q4_K_M' }} + - **Processing Time:** ${{ steps.read_summary.outputs.processing_time || 'N/A' }} + + **Added Models:** + ${{ steps.read_summary.outputs.added_models || '- No models added' }} **Workflow Details:** - Triggered by: `${{ github.event_name }}`