name: AI Catalog Sync on: schedule: - cron: '0 6 * * *' # Daily at 6 AM UTC workflow_dispatch: # Allow manual trigger permissions: contents: write pull-requests: write jobs: sync-catalog: runs-on: ubuntu-latest timeout-minutes: 10 env: NODE_OPTIONS: '--max-old-space-size=4096' steps: - name: Checkout uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: ref: main - name: Install dependencies uses: ./.github/actions/yarn-install - name: Build dependencies run: npx nx build twenty-shared - name: Run catalog sync env: ARTIFICIAL_ANALYSIS_API_KEY: ${{ secrets.ARTIFICIAL_ANALYSIS_API_KEY }} run: | npx nx run twenty-server:ts-node-no-deps-transpile-only -- \ ./scripts/ai-catalog-sync/index.ts --report "${RUNNER_TEMP}/coverage.md" - name: Check for changes id: changes run: | catalog_dir=packages/twenty-server/src/engine/metadata-modules/ai/ai-models if git diff --quiet "$catalog_dir"; then echo "changed=false" >> "$GITHUB_OUTPUT" else echo "changed=true" >> "$GITHUB_OUTPUT" fi - name: Compose pull request body if: steps.changes.outputs.changed == 'true' run: | cat > "${RUNNER_TEMP}/pr-body.md" <<'PREAMBLE' Automated daily sync of the AI model catalog. - Model identity, pricing, context windows and availability come from [models.dev](https://models.dev). - Intelligence, speed and cost per task come from [Artificial Analysis](https://artificialanalysis.ai/), which requires `ARTIFICIAL_ANALYSIS_API_KEY`. New models meeting inclusion criteria (tool calling, pricing data, context limits) are added automatically. Benchmark data is best-effort: a model Artificial Analysis has not rated keeps every other field and simply carries no `benchmark` entry. **Please review before merging** and check the coverage summary below for models that silently stopped matching. PREAMBLE cat "${RUNNER_TEMP}/coverage.md" >> "${RUNNER_TEMP}/pr-body.md" - name: Create pull request if: steps.changes.outputs.changed == 'true' uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.6 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: 'chore: sync AI model catalog' title: 'chore: sync AI model catalog' body-path: ${{ runner.temp }}/pr-body.md branch: chore/ai-catalog-sync base: main labels: ai, automated delete-branch: true - name: Mint twenty-infra dispatch token id: app-token if: steps.changes.outputs.changed == 'true' uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 with: client-id: ${{ vars.TWENTY_WORKFLOW_DISPATCHER_CLIENT_ID }} private-key: ${{ secrets.TWENTY_WORKFLOW_DISPATCHER_PRIVATE_KEY }} owner: twentyhq repositories: twenty-infra permission-actions: write - name: Trigger automerge if: steps.changes.outputs.changed == 'true' env: GH_TOKEN: ${{ steps.app-token.outputs.token }} run: | gh workflow run automerge-i18n.yaml --repo twentyhq/twenty-infra --ref main