diff --git a/.github/workflows/alembic-validation.yml b/.github/workflows/alembic-validation.yml index 97a06990..e5db6758 100644 --- a/.github/workflows/alembic-validation.yml +++ b/.github/workflows/alembic-validation.yml @@ -29,7 +29,6 @@ jobs: uses: tj-actions/changed-files@v44 with: files: | - apps/core/alembic/** alembic/** .github/workflows/alembic-validation.yml @@ -41,25 +40,13 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - - name: Detect core directory - id: detect-core-dir - run: | - if [ -d "apps/core" ]; then - echo "dir=apps/core" >> $GITHUB_OUTPUT - echo "detected=cloud" >> $GITHUB_OUTPUT - else - echo "dir=." >> $GITHUB_OUTPUT - echo "detected=oss" >> $GITHUB_OUTPUT - fi - echo "Using core directory: $(cat $GITHUB_OUTPUT | grep '^dir=' | cut -d'=' -f2)" - + - name: Install dependencies shell: bash - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: uv sync --no-install-project ${{ inputs.install-args || '--extra sqlite --extra external-tools --extra dev --extra cloud-tool-sandbox' }} - name: Test alembic migration - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: | uv run alembic upgrade head # kinda janky but I think this might not matter for sqlite? @@ -67,7 +54,7 @@ jobs: - name: Cleanup persistent data if: ${{ always() }} - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: | echo "Cleaning up persistent data..." sudo rm -rf ~/.letta || true @@ -94,25 +81,13 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - - name: Detect core directory - id: detect-core-dir - run: | - if [ -d "apps/core" ]; then - echo "dir=apps/core" >> $GITHUB_OUTPUT - echo "detected=cloud" >> $GITHUB_OUTPUT - else - echo "dir=." >> $GITHUB_OUTPUT - echo "detected=oss" >> $GITHUB_OUTPUT - fi - echo "Using core directory: $(cat $GITHUB_OUTPUT | grep '^dir=' | cut -d'=' -f2)" - + - name: Install dependencies shell: bash - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: uv sync --no-install-project ${{ inputs.install-args || '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox' }} - name: Test alembic migration - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . env: LETTA_PG_PORT: 5432 LETTA_PG_USER: postgres diff --git a/.github/workflows/core-integration-tests.yml b/.github/workflows/core-integration-tests.yml index 5d732dec..32d36ef0 100644 --- a/.github/workflows/core-integration-tests.yml +++ b/.github/workflows/core-integration-tests.yml @@ -22,7 +22,7 @@ jobs: test-type: 'integration' use-redis: true changed-files-pattern: | - apps/core/** + ** .github/workflows/reusable-test-workflow.yml .github/workflows/core-integration-tests.yml install-args: '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox' diff --git a/.github/workflows/core-lint.yml b/.github/workflows/core-lint.yml index 13496e63..d0201630 100644 --- a/.github/workflows/core-lint.yml +++ b/.github/workflows/core-lint.yml @@ -24,7 +24,6 @@ jobs: uses: tj-actions/changed-files@v44 with: files: | - apps/core/** letta/** tests/** *.py @@ -42,23 +41,9 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Detect core directory - id: detect-core-dir - run: | - # Default to current directory (.), fallback to apps/core if it exists - if [ -d "apps/core" ]; then - echo "dir=apps/core" >> $GITHUB_OUTPUT - echo "detected=cloud" >> $GITHUB_OUTPUT - echo "📁 Using apps/core directory (cloud environment detected)" - else - echo "dir=." >> $GITHUB_OUTPUT - echo "detected=oss" >> $GITHUB_OUTPUT - echo "📁 Using current directory (OSS environment detected)" - fi - - name: Install dependencies shell: bash - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: uv sync --no-install-project ${{ inputs.install-args || '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox' }} - name: Validate PR Title if: github.event_name == 'pull_request' @@ -74,9 +59,9 @@ jobs: continue-on-error: true - name: Run Ruff Check - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: uv run ruff check --config pyproject.toml --diff . - name: Run Ruff Format - working-directory: ${{ steps.detect-core-dir.outputs.dir }} + working-directory: . run: uv run ruff format --config pyproject.toml --check --diff . diff --git a/.github/workflows/core-unit-test.yml b/.github/workflows/core-unit-test.yml index ad98226d..28096b60 100644 --- a/.github/workflows/core-unit-test.yml +++ b/.github/workflows/core-unit-test.yml @@ -22,7 +22,7 @@ jobs: test-type: 'unit' use-redis: true changed-files-pattern: | - apps/core/** + ** .github/workflows/reusable-test-workflow.yml .github/workflows/core-unit-test.yml install-args: '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox --extra google' diff --git a/.github/workflows/fern-docs-preview.yml b/.github/workflows/fern-docs-preview.yml new file mode 100644 index 00000000..32a3de9a --- /dev/null +++ b/.github/workflows/fern-docs-preview.yml @@ -0,0 +1,37 @@ +name: Preview Docs + +on: + pull_request: + paths: + - 'fern/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +jobs: + run: + runs-on: [self-hosted, small] + permissions: write-all + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: true + + - name: Generate preview URL + id: generate-docs + working-directory: fern + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: | + OUTPUT=$(fern generate --docs --preview 2>&1) || true + echo "$OUTPUT" + URL=$(echo "$OUTPUT" | grep -oP 'Published docs to \K.*(?= \()') + echo "Preview URL: $URL" + echo "🌿 Preview your docs: $URL" > preview_url.txt + + - name: Comment URL in PR + uses: thollander/actions-comment-pull-request@v3 + with: + file-path: fern/preview_url.txt diff --git a/.github/workflows/fern-docs-publish.yml b/.github/workflows/fern-docs-publish.yml new file mode 100644 index 00000000..5e64d289 --- /dev/null +++ b/.github/workflows/fern-docs-publish.yml @@ -0,0 +1,21 @@ +name: 🌿 Publish Docs + +on: + push: + branches: [ main ] + +jobs: + run: + runs-on: [self-hosted, medium] + if: ${{ github.event_name == 'push' && contains(github.ref, 'refs/heads/main') && github.run_number > 1 }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: true + + - name: Publish Docs + working-directory: . + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: fern generate --docs --log-level debug diff --git a/.github/workflows/fern-sdk-python-preview.yml b/.github/workflows/fern-sdk-python-preview.yml index 0cdc7af5..678da64f 100644 --- a/.github/workflows/fern-sdk-python-preview.yml +++ b/.github/workflows/fern-sdk-python-preview.yml @@ -12,8 +12,8 @@ on: branches: - main paths: - - 'apps/fern/openapi.json' - - 'apps/fern/openapi-overrides.yml' + - 'fern/openapi.json' + - 'fern/openapi-overrides.yml' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -38,8 +38,8 @@ jobs: uses: tj-actions/changed-files@v44 with: files: | - apps/fern/openapi.json - apps/fern/openapi-overrides.yml + fern/openapi.json + fern/openapi-overrides.yml preview-python-sdk: needs: [changed-files] @@ -73,18 +73,18 @@ jobs: - name: Generate cache key id: cache-key run: | - echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('apps/fern/*', 'apps/core/pyproject.toml') }}" >> $GITHUB_OUTPUT + echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('fern/*', 'pyproject.toml') }}" >> $GITHUB_OUTPUT - name: Try to restore SDK cache id: restore-cache uses: actions/cache/restore@v4 with: path: | - apps/fern/.preview/fern-python-sdk/ + fern/.preview/fern-python-sdk/ key: ${{ steps.cache-key.outputs.key }} - name: Inject env vars into environment - working-directory: apps/core + working-directory: . run: | while IFS= read -r line || [[ -n "$line" ]]; do if [[ -n "$line" ]]; then @@ -114,11 +114,11 @@ jobs: - name: Install dependencies shell: bash - working-directory: apps/core + working-directory: . run: uv sync --no-install-project ${{ inputs.install-args || '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox' }} - name: Migrate database - working-directory: apps/core + working-directory: . env: LETTA_PG_PORT: 5432 LETTA_PG_USER: postgres @@ -130,7 +130,7 @@ jobs: uv run alembic upgrade head - name: Run letta server - working-directory: apps/core + working-directory: . env: LETTA_PG_DB: postgres LETTA_PG_USER: postgres @@ -147,7 +147,7 @@ jobs: - name: Generate Python SDK Preview if: steps.restore-cache.outputs.cache-hit != 'true' - working-directory: apps + working-directory: . env: FERN_TOKEN: ${{ secrets.FERN_TOKEN }} run: | @@ -164,5 +164,5 @@ jobs: uses: actions/cache/save@v4 with: path: | - apps/fern/.preview/fern-python-sdk/ + fern/.preview/fern-python-sdk/ key: ${{ steps.cache-key.outputs.key }} diff --git a/.github/workflows/fern-sdk-python-publish.yml b/.github/workflows/fern-sdk-python-publish.yml new file mode 100644 index 00000000..390e4770 --- /dev/null +++ b/.github/workflows/fern-sdk-python-publish.yml @@ -0,0 +1,50 @@ +name: 🌿 Release Python SDK + +on: + workflow_dispatch: + inputs: + version: + description: "The version of the Python SDK that you would like to release" + required: true + type: string + workflow_run: + workflows: ["🌿 Preview Python SDK"] + types: + - completed + branches: + - main + +jobs: + release: + if: | + github.event_name == 'workflow_dispatch' || + (github.event_name == 'workflow_run' && + github.event.workflow_run.event == 'push' && + github.event.workflow_run.conclusion == 'success') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + submodules: true + + - name: Download Fern + run: npm install -g fern-api + + - name: Generate Python SDK + working-directory: . + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + fern generate --group python-sdk --version ${{ inputs.version }} --log-level debug + else + fern generate --group python-sdk --log-level debug + fi + + - name: Publish Docs + working-directory: . + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: fern generate --docs diff --git a/.github/workflows/fern-sdk-typescript-preview.yml b/.github/workflows/fern-sdk-typescript-preview.yml new file mode 100644 index 00000000..1a8ae5f8 --- /dev/null +++ b/.github/workflows/fern-sdk-typescript-preview.yml @@ -0,0 +1,117 @@ +name: 🌿 Preview TypeScript SDK + +on: + pull_request: + branches: + - main + push: + branches: + - main + paths: + - 'fern/openapi.json' + - 'fern/openapi-overrides.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +jobs: + changed-files: + runs-on: [self-hosted, small] + name: changed-files + outputs: + all_changed_files: ${{ steps.changed-files.outputs.all_changed_files }} + any_changed: ${{ steps.changed-files.outputs.any_changed }} + steps: + - uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v44 + with: + files: | + fern/openapi.json + fern/openapi-overrides.yml + preview-typescript-sdk: + if: ${{ needs.changed-files.outputs.any_changed == 'true' }} + needs: [changed-files] + runs-on: [self-hosted, medium] + services: + postgres: + image: pgvector/pgvector:pg17 + env: + POSTGRES_HOST_AUTH_METHOD: trust + POSTGRES_DB: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + submodules: true + + - name: Install dependencies + shell: bash + working-directory: . + run: uv sync --no-install-project ${{ inputs.install-args || '--extra postgres --extra external-tools --extra dev --extra cloud-tool-sandbox' }} + + - name: Inject env vars into environment + working-directory: . + run: | + while IFS= read -r line || [[ -n "$line" ]]; do + if [[ -n "$line" ]]; then + value=$(echo "$line" | cut -d= -f2-) + echo "::add-mask::$value" + echo "$line" >> $GITHUB_ENV + fi + done < <(letta_secrets_helper --env dev --service ci) + + - name: Migrate database + working-directory: . + env: + LETTA_PG_PORT: 5432 + LETTA_PG_USER: postgres + LETTA_PG_PASSWORD: postgres + LETTA_PG_DB: postgres + LETTA_PG_HOST: localhost + run: | + psql -h localhost -U postgres -d postgres -c 'CREATE EXTENSION vector' + uv run alembic upgrade head + + - name: Run letta server + working-directory: . + env: + LETTA_PG_DB: postgres + LETTA_PG_USER: postgres + LETTA_PG_PASSWORD: postgres + LETTA_PG_HOST: localhost + LETTA_PG_PORT: 5432 + OPENAI_API_KEY: ${{ env.OPENAI_API_KEY }} + E2B_SANDBOX_TEMPLATE_ID: ${{ env.E2B_SANDBOX_TEMPLATE_ID }} + run: | + # Run server in background + uv run letta server & + # Wait for server to be ready + timeout 60 bash -c 'until curl -s http://localhost:8283/health; do sleep 1; done' + + - name: Generate TypeScript SDK Preview + working-directory: . + env: + LETTA_ENV: localhost + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: | + fern generate --group ts-sdk --preview + cd fern/.preview/fern-typescript-node-sdk + yarn install + yarn build + yarn test tests/custom.test.ts diff --git a/.github/workflows/fern-sdk-typescript-publish.yml b/.github/workflows/fern-sdk-typescript-publish.yml new file mode 100644 index 00000000..7e39cb0e --- /dev/null +++ b/.github/workflows/fern-sdk-typescript-publish.yml @@ -0,0 +1,50 @@ +name: 🌿 Release TypeScript SDK + +on: + workflow_dispatch: + inputs: + version: + description: "The version of the TypeScript SDK that you would like to release" + required: true + type: string + workflow_run: + workflows: ["🌿 Preview TypeScript SDK"] + types: + - completed + branches: + - main + +jobs: + release: + if: | + github.event_name == 'workflow_dispatch' || + (github.event_name == 'workflow_run' && + github.event.workflow_run.event == 'push' && + github.event.workflow_run.conclusion == 'success') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + submodules: true + + - name: Download Fern + run: npm install -g fern-api + + - name: Generate TypeScript SDK + working-directory: . + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + fern generate --group ts-sdk --version ${{ inputs.version }} --log-level debug + else + fern generate --group ts-sdk --log-level debug + fi + + - name: Publish Docs + working-directory: . + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: fern generate --docs diff --git a/.github/workflows/lint-command.yml b/.github/workflows/lint-command.yml index 451d04a6..939b557e 100644 --- a/.github/workflows/lint-command.yml +++ b/.github/workflows/lint-command.yml @@ -96,7 +96,7 @@ jobs: - name: Install dependencies run: uv sync --extra dev --extra postgres --extra external-tools - working-directory: ./apps/core + working-directory: . # - name: Run ruff check with fixes # run: uv run ruff check --fix . @@ -106,7 +106,7 @@ jobs: - name: Run isort, black, autoflake run: uv run isort . --profile black && uv run black . && uv run autoflake --remove-all-unused-imports --remove-unused-variables --in-place --recursive --ignore-init-module-imports . - working-directory: ./apps/core + working-directory: . - name: Check for changes diff --git a/.github/workflows/reusable-test-workflow.yml b/.github/workflows/reusable-test-workflow.yml index 59bbe9b6..6fae7730 100644 --- a/.github/workflows/reusable-test-workflow.yml +++ b/.github/workflows/reusable-test-workflow.yml @@ -8,10 +8,10 @@ on: required: true type: string core-directory: - description: 'Working directory for commands. Auto-detects between apps/core (cloud) and . (OSS). Can be overridden.' + description: 'Working directory for commands. Uses . (root) by default.' required: false type: string - default: 'auto' + default: '.' install-args: description: 'uv sync arguments' required: true @@ -46,7 +46,7 @@ on: required: false type: string default: | - apps/core/** + ** .github/workflows/reusable-test-workflow.yml skip-fern-generation: description: 'Skip Fern SDK generation' @@ -98,19 +98,19 @@ jobs: uses: actions/checkout@v4 - name: Generate cache key - if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml')) + if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml')) id: cache-key run: | - echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('apps/fern/*', 'apps/core/pyproject.toml') }}" >> $GITHUB_OUTPUT + echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('fern/*', 'pyproject.toml') }}" >> $GITHUB_OUTPUT - name: Restore SDK cache # skip if "skip-fern-generation" is true or if the upstream workflow would've generated an sdk preview (changes to openapi files) - if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml')) + if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml')) id: cache uses: actions/cache/restore@v4 with: path: | - apps/fern/.preview/fern-python-sdk/ + fern/.preview/fern-python-sdk/ key: ${{ steps.cache-key.outputs.key }} fail-on-cache-miss: false @@ -131,7 +131,7 @@ jobs: echo "Event name: ${{ github.event_name }}" - name: Wait for Preview SDK workflow - if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml')) + if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml')) env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -224,49 +224,39 @@ jobs: with: enable-cache: true - - name: Detect core directory + - name: Set core directory id: detect-core-dir run: | - if [ "${{ inputs.core-directory }}" = "auto" ]; then - if [ -d "apps/core" ]; then - echo "dir=apps/core" >> $GITHUB_OUTPUT - echo "detected=cloud" >> $GITHUB_OUTPUT - else - echo "dir=." >> $GITHUB_OUTPUT - echo "detected=oss" >> $GITHUB_OUTPUT - fi - else - echo "dir=${{ inputs.core-directory }}" >> $GITHUB_OUTPUT - echo "detected=manual" >> $GITHUB_OUTPUT - fi + echo "dir=${{ inputs.core-directory }}" >> $GITHUB_OUTPUT + echo "detected=manual" >> $GITHUB_OUTPUT echo "Using core directory: $(cat $GITHUB_OUTPUT | grep '^dir=' | cut -d'=' -f2)" - name: Generate cache key - if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml')) + if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml')) id: cache-key run: | - echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('apps/fern/*', 'apps/core/pyproject.toml') }}" >> $GITHUB_OUTPUT + echo "key=sdk-${{ github.ref_name }}-${{ hashFiles('fern/*', 'pyproject.toml') }}" >> $GITHUB_OUTPUT - name: Restore SDK cache # skip if "skip-fern-generation" is true or if the upstream workflow would've generated an sdk preview (changes to openapi files) - if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml')) + if: inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml')) id: restore-sdk-cache uses: actions/cache/restore@v4 with: path: | - apps/fern/.preview/fern-python-sdk/ + fern/.preview/fern-python-sdk/ key: ${{ steps.cache-key.outputs.key }} fail-on-cache-miss: false - name: Check SDK cache availability - if: (inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'apps/fern/openapi-overrides.yml'))) && steps.restore-sdk-cache.outputs.cache-hit != 'true' + if: (inputs.skip-fern-generation != true || (!contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi.json') && !contains(needs.changed-files.outputs.all_changed_files, 'fern/openapi-overrides.yml'))) && steps.restore-sdk-cache.outputs.cache-hit != 'true' run: | echo "❌ Preview Python SDK cache expired or missing!" echo "📦 Cache key: ${{ steps.cache-key.outputs.key }}" echo "🔄 To fix: Re-run the 'preview-python-sdk' workflow job to regenerate the SDK" echo "💡 This can happen when:" echo " - The cache entry has expired" - echo " - Dependencies in apps/fern/* or apps/core/pyproject.toml have changed" + echo " - Dependencies in fern/* or pyproject.toml have changed" echo " - The preview-python-sdk job hasn't run successfully for this branch/commit" exit 1 diff --git a/.github/workflows/send-message-integration-tests.yaml b/.github/workflows/send-message-integration-tests.yaml deleted file mode 100644 index 9982951d..00000000 --- a/.github/workflows/send-message-integration-tests.yaml +++ /dev/null @@ -1,157 +0,0 @@ -name: Send Message SDK Tests -on: - pull_request_target: - branches: [main] # TODO: uncomment before merge - types: [labeled] - paths: - - 'letta/**' - -jobs: - send-messages: - # Only run when the "safe to test" label is applied - if: contains(github.event.pull_request.labels.*.name, 'safe to test') - runs-on: ubuntu-latest - timeout-minutes: 15 - strategy: - fail-fast: false - matrix: - config_file: - - "openai-gpt-4o-mini.json" - - "azure-gpt-4o-mini.json" - - "claude-3-5-sonnet.json" - - "claude-4-sonnet-extended.json" - - "claude-3-7-sonnet-extended.json" - - "gemini-pro.json" - - "gemini-vertex.json" - services: - qdrant: - image: qdrant/qdrant - ports: - - 6333:6333 - postgres: - image: pgvector/pgvector:pg17 - ports: - - 5432:5432 - env: - POSTGRES_HOST_AUTH_METHOD: trust - POSTGRES_DB: postgres - POSTGRES_USER: postgres - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - redis: - image: redis:7 - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 5s - --health-timeout 5s - --health-retries 10 - - steps: - # Ensure secrets don't leak - - name: Configure git to hide secrets - run: | - git config --global core.logAllRefUpdates false - git config --global log.hideCredentials true - - name: Set up secret masking - run: | - # Automatically mask any environment variable ending with _KEY - for var in $(env | grep '_KEY=' | cut -d= -f1); do - value="${!var}" - if [[ -n "$value" ]]; then - # Mask the full value - echo "::add-mask::$value" - - # Also mask partial values (first and last several characters) - # This helps when only parts of keys appear in logs - if [[ ${#value} -gt 8 ]]; then - echo "::add-mask::${value:0:8}" - echo "::add-mask::${value:(-8)}" - fi - - # Also mask with common formatting changes - # Some logs might add quotes or other characters - echo "::add-mask::\"$value\"" - echo "::add-mask::$value\"" - echo "::add-mask::\"$value" - - echo "Masked secret: $var (length: ${#value})" - fi - done - - # Check out base repository code, not the PR's code (for security) - - name: Checkout base repository - uses: actions/checkout@v4 # No ref specified means it uses base branch - - # Only extract relevant files from the PR (for security, specifically prevent modification of workflow files) - - name: Extract PR schema files - run: | - # Fetch PR without checking it out - git fetch origin pull/${{ github.event.pull_request.number }}/head:pr-${{ github.event.pull_request.number }} - - # Extract ONLY the schema files - git checkout pr-${{ github.event.pull_request.number }} -- letta/ - - name: Set up python 3.12 - id: setup-python - uses: actions/setup-python@v5 - with: - python-version: 3.12 - - name: Install uv - uses: astral-sh/setup-uv@v4 - with: - version: "latest" - - name: Load cached venv - id: cached-uv-dependencies - uses: actions/cache@v4 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/uv.lock') }} - restore-keys: | - venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}- - - name: Install dependencies - if: steps.cached-uv-dependencies.outputs.cache-hit != 'true' - shell: bash - run: uv sync --extra dev --extra postgres --extra external-tools --extra cloud-tool-sandbox --extra google - - name: Install letta packages - run: | - uv run pip install --upgrade letta-client letta - - name: Migrate database - env: - LETTA_PG_PORT: 5432 - LETTA_PG_USER: postgres - LETTA_PG_PASSWORD: postgres - LETTA_PG_DB: postgres - LETTA_PG_HOST: localhost - run: | - psql -h localhost -U postgres -d postgres -c 'CREATE EXTENSION vector' - uv run alembic upgrade head - - name: Run integration tests for ${{ matrix.config_file }} - env: - LLM_CONFIG_FILE: ${{ matrix.config_file }} - LETTA_PG_PORT: 5432 - LETTA_PG_USER: postgres - LETTA_PG_PASSWORD: postgres - LETTA_PG_DB: postgres - LETTA_PG_HOST: localhost - LETTA_REDIS_HOST: localhost - LETTA_REDIS_PORT: 6379 - LETTA_SERVER_PASS: test_server_token - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - AZURE_API_KEY: ${{ secrets.AZURE_API_KEY }} - AZURE_BASE_URL: ${{ secrets.AZURE_BASE_URL }} - GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} - COMPOSIO_API_KEY: ${{ secrets.COMPOSIO_API_KEY }} - DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} - GOOGLE_CLOUD_PROJECT: ${{ secrets.GOOGLE_CLOUD_PROJECT }} - GOOGLE_CLOUD_LOCATION: ${{ secrets.GOOGLE_CLOUD_LOCATION }} - LETTA_GEMINI_FORCE_MINIMUM_THINKING_BUDGET: true - run: | - uv run pytest \ - -s -vv \ - tests/integration_test_send_message.py \ - --maxfail=1 --durations=10 diff --git a/.github/workflows/send-message-integration-tests.yml b/.github/workflows/send-message-integration-tests.yml index e468a5f4..a2a6ab82 100644 --- a/.github/workflows/send-message-integration-tests.yml +++ b/.github/workflows/send-message-integration-tests.yml @@ -21,7 +21,7 @@ jobs: with: test-type: 'send-message' changed-files-pattern: | - apps/core/** + ** .github/workflows/reusable-test-workflow.yml .github/workflows/send-message-integration-tests.yml install-args: '--extra dev --extra postgres --extra external-tools --extra cloud-tool-sandbox --extra google --extra redis' diff --git a/.github/workflows/test-lmstudio.yml b/.github/workflows/test-lmstudio.yml index c190899a..83e76914 100644 --- a/.github/workflows/test-lmstudio.yml +++ b/.github/workflows/test-lmstudio.yml @@ -10,13 +10,13 @@ on: # default: ${{ github.sha || github.ref || github.event.pull_request.head.sha }} pull_request: paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-lmstudio.yml' - '.github/workflows/reusable-test-workflow.yml' pull_request_target: types: [labeled] paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-lmstudio.yml' - '.github/workflows/reusable-test-workflow.yml' diff --git a/.github/workflows/test-ollama.yml b/.github/workflows/test-ollama.yml index d0b3be68..20bcc414 100644 --- a/.github/workflows/test-ollama.yml +++ b/.github/workflows/test-ollama.yml @@ -10,13 +10,13 @@ on: # default: ${{ github.sha || github.ref || github.event.pull_request.head.sha }} pull_request: paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-ollama.yml' - '.github/workflows/reusable-test-workflow.yml' pull_request_target: types: [labeled] paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-ollama.yml' - '.github/workflows/reusable-test-workflow.yml' diff --git a/.github/workflows/test-vllm.yml b/.github/workflows/test-vllm.yml index 0aecd1c6..ee8448a3 100644 --- a/.github/workflows/test-vllm.yml +++ b/.github/workflows/test-vllm.yml @@ -10,13 +10,13 @@ on: # default: ${{ github.sha || github.ref || github.event.pull_request.head.sha }} pull_request: paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-vllm.yml' - '.github/workflows/reusable-test-workflow.yml' pull_request_target: types: [labeled] paths: - - 'apps/core/**' + - '**' - '.github/workflows/test-vllm.yml' - '.github/workflows/reusable-test-workflow.yml'