Sync Model Catalogs #100
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Sync Model Catalogs | |
| on: | |
| schedule: | |
| - cron: "17 * * * *" | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| issues: write | |
| pull-requests: write | |
| concurrency: ${{ github.workflow }}-${{ github.ref }} | |
| jobs: | |
| providers: | |
| if: github.repository == 'anomalyco/models.dev' | |
| runs-on: ubuntu-latest | |
| outputs: | |
| matrix: ${{ steps.providers.outputs.matrix }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 | |
| with: | |
| ref: dev | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@f4d14e03ff726c06358e5557344e1da148b56cf7 | |
| with: | |
| bun-version: latest | |
| - name: Install dependencies | |
| run: bun install | |
| - name: List sync providers | |
| id: providers | |
| run: | | |
| matrix="$(bun models:sync --list-providers)" | |
| echo "matrix=$matrix" >> "$GITHUB_OUTPUT" | |
| sync: | |
| needs: providers | |
| if: github.repository == 'anomalyco/models.dev' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJSON(needs.providers.outputs.matrix) }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 | |
| with: | |
| ref: dev | |
| persist-credentials: false | |
| - name: Setup git committer | |
| id: committer | |
| uses: ./.github/actions/setup-git-committer | |
| with: | |
| opencode-app-id: ${{ vars.OPENCODE_APP_ID }} | |
| opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@f4d14e03ff726c06358e5557344e1da148b56cf7 | |
| with: | |
| bun-version: latest | |
| - name: Install dependencies | |
| run: bun install | |
| - name: Sync model catalogs | |
| run: bun models:sync ${{ matrix.provider }} | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} | |
| BASETEN_API_KEY: ${{ secrets.BASETEN_API_KEY }} | |
| DEEPINFRA_API_KEY: ${{ secrets.DEEPINFRA_API_KEY }} | |
| DIGITALOCEAN_API_TOKEN: ${{ secrets.DIGITALOCEAN_API_TOKEN }} | |
| DIGITALOCEAN_ACCESS_TOKEN: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }} | |
| LLMGATEWAY_API_KEY: ${{ secrets.LLMGATEWAY_API_KEY }} | |
| MERGE_GATEWAY_API_KEY: ${{ secrets.MERGE_GATEWAY_API_KEY }} | |
| KILO_API_KEY: ${{ secrets.KILO_API_KEY }} | |
| GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} | |
| GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} | |
| GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }} | |
| XAI_API_KEY: ${{ secrets.XAI_API_KEY }} | |
| CLOUDFLARE_WORKERS_AI_SYNC_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_WORKERS_AI_SYNC_ACCOUNT_ID }} | |
| CLOUDFLARE_WORKERS_AI_SYNC_API_TOKEN: ${{ secrets.CLOUDFLARE_WORKERS_AI_SYNC_API_TOKEN }} | |
| - name: Validate models | |
| run: bun validate | |
| - name: Report changes | |
| id: report | |
| env: | |
| GH_TOKEN: ${{ steps.committer.outputs.token }} | |
| BRANCH: automation/sync-models-${{ matrix.provider }} | |
| LABELS: automation,model-sync,provider:${{ matrix.provider }} | |
| TITLE: "chore(sync): update ${{ matrix.name }} model catalog" | |
| run: | | |
| tee -a "$GITHUB_STEP_SUMMARY" < .sync/model-sync-report.md >/dev/null | |
| label_args=() | |
| IFS=',' read -ra labels <<< "$LABELS" | |
| for label in "${labels[@]}"; do | |
| gh label create "$label" --color "0E8A16" --description "Automated model catalog sync" >/dev/null 2>&1 || true | |
| label_args+=(--label "$label") | |
| done | |
| if [ -z "$(git status --porcelain -- models providers)" ]; then | |
| echo "No model catalog changes found." | |
| exit 0 | |
| fi | |
| git fetch --no-tags --depth=1 origin "+refs/heads/$BRANCH:refs/remotes/origin/$BRANCH" || true | |
| git checkout -B "$BRANCH" | |
| git add models providers | |
| git commit -m "$TITLE" | |
| bun sync:auto-merge HEAD^ HEAD | |
| safe="$(sed -n 's/^safe=//p' "$GITHUB_OUTPUT" | tail -1)" | |
| pr_number="$(gh pr list --head "$BRANCH" --base dev --json number --jq '.[0].number')" | |
| if [ "$safe" != "true" ] && [ -n "$pr_number" ]; then | |
| gh pr merge "$pr_number" --disable-auto || true | |
| if [ "$(gh pr view "$pr_number" --json autoMergeRequest --jq '.autoMergeRequest == null')" != "true" ]; then | |
| echo "Failed to disable auto-merge for unsafe sync PR #$pr_number." | |
| exit 1 | |
| fi | |
| fi | |
| git push --force-with-lease origin "$BRANCH" | |
| if [ -n "$pr_number" ]; then | |
| gh pr edit "$pr_number" --title "$TITLE" --body-file .sync/model-sync-report.md | |
| for label in "${labels[@]}"; do | |
| gh pr edit "$pr_number" --add-label "$label" | |
| done | |
| else | |
| gh pr create --base dev --head "$BRANCH" --title "$TITLE" --body-file .sync/model-sync-report.md "${label_args[@]}" | |
| pr_number="$(gh pr list --head "$BRANCH" --base dev --json number --jq '.[0].number')" | |
| fi | |
| if [ "$safe" = "true" ]; then | |
| gh pr merge "$pr_number" --auto --squash | |
| elif [ "$(gh pr view "$pr_number" --json autoMergeRequest --jq '.autoMergeRequest == null')" != "true" ]; then | |
| echo "Unsafe sync PR #$pr_number still has auto-merge enabled." | |
| exit 1 | |
| fi |