From acba1f5c6444eed9ff8004e7e87b8130f57a7869 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 14 Aug 2024 11:51:16 +0200 Subject: [PATCH 01/32] wip --- tests/e2e-tests/package.json | 2 +- tests/smoke-test/app/main.ts | 7 +++++++ tests/smoke-test/app/server.ts | 32 ++++++++++++++++++++++++++++++++ tests/smoke-test/jest.config.mjs | 5 +++++ tests/smoke-test/package.json | 29 +++++++++++++++++++++++++++++ tests/smoke-test/tsconfig.json | 11 +++++++++++ 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/smoke-test/app/main.ts create mode 100644 tests/smoke-test/app/server.ts create mode 100644 tests/smoke-test/jest.config.mjs create mode 100644 tests/smoke-test/package.json create mode 100644 tests/smoke-test/tsconfig.json diff --git a/tests/e2e-tests/package.json b/tests/e2e-tests/package.json index 743c79c3..5ff06378 100644 --- a/tests/e2e-tests/package.json +++ b/tests/e2e-tests/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@sap-ai-sdk/e2e-tests", - "version": "0.0.1", + "version": "0.0.0", "main": "./dist/index.js", "types": "./dist/index.d.ts", "private": "true", diff --git a/tests/smoke-test/app/main.ts b/tests/smoke-test/app/main.ts new file mode 100644 index 00000000..e8d9bdda --- /dev/null +++ b/tests/smoke-test/app/main.ts @@ -0,0 +1,7 @@ +export async function orchestration(): Promise { + return 'TODO'; +} + +export async function aiCore(): Promise { + return 'TODO'; +} diff --git a/tests/smoke-test/app/server.ts b/tests/smoke-test/app/server.ts new file mode 100644 index 00000000..ac2c6c84 --- /dev/null +++ b/tests/smoke-test/app/server.ts @@ -0,0 +1,32 @@ +/* eslint-disable no-console */ +import express from 'express'; +import { aiCore, orchestration } from './main.js'; + +const app = express(); +const port = 8080; + +app.get(['/', '/health'], (req, res) => { + res.send('Hello World! 🌍'); +}); + +app.get('/aicore', async (req, res) => { + try { + res.send(await aiCore()); + } catch (error: any) { + console.error(error); + res.status(500).send('AI Core request failed.' + error.message); + } +}); + +app.get('/orchestration', async (req, res) => { + try { + res.send(await orchestration()); + } catch (error: any) { + console.error(error); + res.status(500).send('AI Core request failed.' + error.message); + } +}); + +app.listen(port, () => { + console.log(`Server running at http://localhost:${port}`); +}); diff --git a/tests/smoke-test/jest.config.mjs b/tests/smoke-test/jest.config.mjs new file mode 100644 index 00000000..0066bc52 --- /dev/null +++ b/tests/smoke-test/jest.config.mjs @@ -0,0 +1,5 @@ +import config from '../../jest.config.mjs'; +export default { + ...config, + displayName: 'smoke-test', +}; diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json new file mode 100644 index 00000000..fe31f5c0 --- /dev/null +++ b/tests/smoke-test/package.json @@ -0,0 +1,29 @@ +{ + "type": "module", + "name": "@sap-ai-sdk/smoke-test", + "version": "0.0.0", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "private": "true", + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map" + ], + "dependencies": { + "@sap-ai-sdk/gen-ai-hub": "canary", + "@sap-ai-sdk/ai-core": "canary", + "@types/express": "^4.17.21", + "express": "^4.19.2" + }, + "scripts": { + "compile": "tsc", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", + "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", + "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" + }, + "devDependencies": { + "dotenv": "^16.4.5" + } +} diff --git a/tests/smoke-test/tsconfig.json b/tests/smoke-test/tsconfig.json new file mode 100644 index 00000000..7a08d33d --- /dev/null +++ b/tests/smoke-test/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/.tsbuildinfo", + "composite": true + }, + "include": ["**/*.ts"], + "exclude": ["dist/**/*", "node_modules/**/*"] +} From edffb80d8dfeeba05066c555d6f6f25155a6c30e Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 15:43:54 +0200 Subject: [PATCH 02/32] chore: add smoke test --- .../{e2e-test.yaml => e2e-tests.yaml} | 15 ++-- .github/workflows/fosstars.yml | 1 + .github/workflows/smoke-test.yml | 43 ++++++++++ package.json | 10 ++- pnpm-lock.yaml | 78 +++++++++++++++++++ pnpm-workspace.yaml | 6 +- tests/smoke-test/app/main.ts | 7 -- tests/smoke-test/app/server.ts | 32 -------- tests/smoke-test/manifest.yml | 10 +++ tests/smoke-test/package.json | 25 +++--- tests/smoke-test/test/smoke.test.ts | 16 ++++ tests/smoke-test/tsconfig.json | 2 +- 12 files changed, 177 insertions(+), 68 deletions(-) rename .github/workflows/{e2e-test.yaml => e2e-tests.yaml} (90%) create mode 100644 .github/workflows/smoke-test.yml delete mode 100644 tests/smoke-test/app/main.ts delete mode 100644 tests/smoke-test/app/server.ts create mode 100644 tests/smoke-test/manifest.yml create mode 100644 tests/smoke-test/test/smoke.test.ts diff --git a/.github/workflows/e2e-test.yaml b/.github/workflows/e2e-tests.yaml similarity index 90% rename from .github/workflows/e2e-test.yaml rename to .github/workflows/e2e-tests.yaml index 2011b156..a84d9c83 100644 --- a/.github/workflows/e2e-test.yaml +++ b/.github/workflows/e2e-tests.yaml @@ -1,11 +1,12 @@ -name: "E2E Test" +name: e2e tests + on: workflow_dispatch: schedule: - cron: 0 22 * * * jobs: - e2e-test: + e2e-tests: strategy: fail-fast: false matrix: @@ -16,10 +17,10 @@ jobs: include: - environment: production secret-name: AI_CORE_PRODUCTION - name: "Build and Test" + name: 'Build and Test' runs-on: ubuntu-latest steps: - - name: "Checkout repository" + - name: 'Checkout repository' uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 with: @@ -37,7 +38,7 @@ jobs: echo "aicore='$aicore'" > tests/e2e-tests/.env url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') echo "Using AI Core ${{ matrix.environment }} instance on $url" - - name: "Check Sample App Starts Up" + - name: 'Check Sample App Starts Up' working-directory: ./sample-code run: | pnpm run local & @@ -51,9 +52,9 @@ jobs: fi done wget -qO- -S --content-on-error localhost:8080 - - name: "Execute E2E Tests" + - name: 'Execute E2E Tests' run: pnpm test:e2e - - name: "Slack Notification" + - name: 'Slack Notification' if: failure() uses: slackapi/slack-github-action@v1.26.0 with: diff --git a/.github/workflows/fosstars.yml b/.github/workflows/fosstars.yml index 5f416b60..4461a5da 100644 --- a/.github/workflows/fosstars.yml +++ b/.github/workflows/fosstars.yml @@ -1,4 +1,5 @@ name: 'Fosstars (Security)' + on: workflow_dispatch: schedule: diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml new file mode 100644 index 00000000..afebf63c --- /dev/null +++ b/.github/workflows/smoke-test.yml @@ -0,0 +1,43 @@ +name: smoke test + +on: + workflow_dispatch: + schedule: + - cron: 0 22 * * * + +jobs: + smoke-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: ${{ vars.PNPM_VERSION }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ vars.DEFAULT_NODE_VERSION }} + cache: 'pnpm' + - run: pnpm i --frozen-lockfile + # - name: Create .env file + # env: + # aicore: ${{ secrets[matrix.secret-name] }} + # run: | + # echo "aicore='$aicore'" > sample-code/.env + # echo "aicore='$aicore'" > tests/e2e-tests/.env + # url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') + # echo "Using AI Core ${{ matrix.environment }} instance on $url" + - name: setup app + run: | + pnpm run create-deployment + pnpm run compile + - uses: vchrisb/setup-cf@v0 + name: deloy to CF + with: + api: ${{ secrets.CF_API_URL }} + username: ${{ secrets.CF_USER }} + password: ${{ secrets.CF_PASSWORD }} + org: ${{ vars.CF_ORG }} + space: ${{ vars.CF_SPACE }} + command: push + - name: smoke test + run: pnpm test:smoke diff --git a/package.json b/package.json index 24d97603..0f059d2e 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,18 @@ "postinstall": "pnpm compile", "compile": "pnpm -r -w=false run compile", "test:unit": "pnpm -r -F=./packages/** test", - "test:type": "pnpm -F=@sap-ai-sdk/type-tests test", - "test:e2e": "pnpm -F=@sap-ai-sdk/e2e-tests test", + "test:type": "pnpm type-tests test", + "test:e2e": "pnpm e2e-tests test", + "test:smoke": "pnpm smoke-test test", "lint": "pnpm -r run lint", "lint:fix": "pnpm -r run lint:fix", "generate": "pnpm -r run generate", "ai-core": "pnpm -F=@sap-ai-sdk/ai-core", "gen-ai-hub": "pnpm -F=@sap-ai-sdk/gen-ai-hub", - "core": "pnpm -F=@sap-ai-sdk/core" + "core": "pnpm -F=@sap-ai-sdk/core", + "e2e-tests": "pnpm -F=@sap-ai-sdk/e2e-tests", + "type-tests": "pnpm -F=@sap-ai-sdk/type-tests", + "smoke-test": "pnpm -F=@sap-ai-sdk/smoke-test" }, "devDependencies": { "@changesets/cli": "^2.27.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6949ac77..ed313187 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,6 +148,28 @@ importers: specifier: ^16.4.5 version: 16.4.5 + tests/smoke-test: + dependencies: + '@sap-ai-sdk/ai-core': + specifier: canary + version: 0.0.1-20240814131615.0 + '@sap-ai-sdk/gen-ai-hub': + specifier: canary + version: 0.0.1-20240814131615.0 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + express: + specifier: ^4.19.2 + version: 4.19.2 + devDependencies: + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + dotenv-cli: + specifier: ^7.4.2 + version: 7.4.2 + tests/type-tests: devDependencies: '@sap-ai-sdk/core': @@ -644,6 +666,15 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@sap-ai-sdk/ai-core@0.0.1-20240814131615.0': + resolution: {integrity: sha512-9yNGdwaCS4kgJ1ZLm9zbwB/bRlZA6I3wTnBDoI0xHfG2me1mormirVYjt8h053tIHCyoPFuowSqmc+0exa0FoQ==} + + '@sap-ai-sdk/core@0.0.1-20240814131615.0': + resolution: {integrity: sha512-xAnKG6lyOlo++nOck3yvHU0nu+Ii7vbQCNI6VeGk+aTmXPsdsEAf/ITXshMn3aEkdaQmqT7kuvD7zZGHta40ng==} + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240814131615.0': + resolution: {integrity: sha512-yzoSZkxb+4oqxr+1Md4GMrmCIPCikS19z1Q7+DpvHFhfkuNiszdGgqMXglqaD/DuzqQbvmJaZkt4yfOGUH2elg==} + '@sap-cloud-sdk/connectivity@3.18.0': resolution: {integrity: sha512-6J/aXAIUZR4P1QiUNZlrCNE3hRD8KSjQUY1jpHEbZnbXfOYQ1krAOyImsMH7/TuKAuqX6MoKPBiSIZaCTlVjGQ==} @@ -1332,6 +1363,14 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dotenv-cli@7.4.2: + resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -4169,6 +4208,36 @@ snapshots: '@pkgr/core@0.1.1': {} + '@sap-ai-sdk/ai-core@0.0.1-20240814131615.0': + dependencies: + '@sap-cloud-sdk/openapi': 3.18.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/core@0.0.1-20240814131615.0': + dependencies: + '@sap-cloud-sdk/connectivity': 3.18.0 + '@sap-cloud-sdk/http-client': 3.18.0 + '@sap-cloud-sdk/util': 3.18.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240814131615.0': + dependencies: + '@sap-ai-sdk/core': 0.0.1-20240814131615.0 + '@sap-cloud-sdk/connectivity': 3.18.0 + '@sap-cloud-sdk/http-client': 3.18.0 + '@sap-cloud-sdk/openapi': 3.18.0 + '@sap-cloud-sdk/util': 3.18.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + '@sap-cloud-sdk/connectivity@3.18.0': dependencies: '@sap-cloud-sdk/resilience': 3.18.0 @@ -4996,6 +5065,15 @@ snapshots: dependencies: esutils: 2.0.3 + dotenv-cli@7.4.2: + dependencies: + cross-spawn: 7.0.3 + dotenv: 16.4.5 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + + dotenv-expand@10.0.0: {} + dotenv@16.4.5: {} eastasianwidth@0.2.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7d9348b8..72c805a1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,11 +3,7 @@ packages: - 'packages/ai-core' - 'packages/gen-ai-hub' - 'packages/core' - # sample code - 'sample-code' - # e2e tests - 'tests/e2e-tests' - # type tests - 'tests/type-tests' - # exclude packages that are inside test directories - + - 'tests/smoke-test' diff --git a/tests/smoke-test/app/main.ts b/tests/smoke-test/app/main.ts deleted file mode 100644 index e8d9bdda..00000000 --- a/tests/smoke-test/app/main.ts +++ /dev/null @@ -1,7 +0,0 @@ -export async function orchestration(): Promise { - return 'TODO'; -} - -export async function aiCore(): Promise { - return 'TODO'; -} diff --git a/tests/smoke-test/app/server.ts b/tests/smoke-test/app/server.ts deleted file mode 100644 index ac2c6c84..00000000 --- a/tests/smoke-test/app/server.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable no-console */ -import express from 'express'; -import { aiCore, orchestration } from './main.js'; - -const app = express(); -const port = 8080; - -app.get(['/', '/health'], (req, res) => { - res.send('Hello World! 🌍'); -}); - -app.get('/aicore', async (req, res) => { - try { - res.send(await aiCore()); - } catch (error: any) { - console.error(error); - res.status(500).send('AI Core request failed.' + error.message); - } -}); - -app.get('/orchestration', async (req, res) => { - try { - res.send(await orchestration()); - } catch (error: any) { - console.error(error); - res.status(500).send('AI Core request failed.' + error.message); - } -}); - -app.listen(port, () => { - console.log(`Server running at http://localhost:${port}`); -}); diff --git a/tests/smoke-test/manifest.yml b/tests/smoke-test/manifest.yml new file mode 100644 index 00000000..a6821224 --- /dev/null +++ b/tests/smoke-test/manifest.yml @@ -0,0 +1,10 @@ +applications: + - name: smoke-test-app + path: . + memory: 256M + buildpacks: + - nodejs_buildpack + services: + - default_aicore + routes: + - route: 'smoke-test-app.cfapps.eu12-001.hana.ondemand.com' diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json index fe31f5c0..5867053a 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-test/package.json @@ -5,25 +5,24 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "private": "true", - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map" - ], - "dependencies": { - "@sap-ai-sdk/gen-ai-hub": "canary", - "@sap-ai-sdk/ai-core": "canary", - "@types/express": "^4.17.21", - "express": "^4.19.2" - }, "scripts": { + "start": "node dist/server.js", "compile": "tsc", + "create-deployment": "rm -rf deployment dist && cp -r ../../sample-code/src ./deployment && cp ./package.json ./deployment", + "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", + "cf-push": "cf push", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" }, + "dependencies": { + "@sap-ai-sdk/ai-core": "canary", + "@sap-ai-sdk/gen-ai-hub": "canary", + "@types/express": "^4.17.21", + "express": "^4.19.2" + }, "devDependencies": { - "dotenv": "^16.4.5" + "dotenv": "^16.4.5", + "dotenv-cli": "^7.4.2" } } diff --git a/tests/smoke-test/test/smoke.test.ts b/tests/smoke-test/test/smoke.test.ts new file mode 100644 index 00000000..a0999cb3 --- /dev/null +++ b/tests/smoke-test/test/smoke.test.ts @@ -0,0 +1,16 @@ +const smokeTestRoute = + 'https://smoke-test-app.cfapps.eu12-001.hana.ondemand.com'; +describe('Smoke Test', () => { + it('aicore', async () => { + await expect(fetch(`${smokeTestRoute}/llm`)).resolves.toHaveProperty( + 'status', + 200 + ); + }); + + it('orchestration', async () => { + await expect( + fetch(`${smokeTestRoute}/orchestration`) + ).resolves.toHaveProperty('status', 200); + }); +}); diff --git a/tests/smoke-test/tsconfig.json b/tests/smoke-test/tsconfig.json index 7a08d33d..93ce334b 100644 --- a/tests/smoke-test/tsconfig.json +++ b/tests/smoke-test/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src", + "rootDir": "./deployment", "outDir": "./dist", "tsBuildInfoFile": "./dist/.tsbuildinfo", "composite": true From 2faa7df7a7ee2ccb7a1a847ed2864e81d259b7bf Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 15:44:51 +0200 Subject: [PATCH 03/32] add pr for testing --- .github/workflows/smoke-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index afebf63c..84f6d468 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -1,6 +1,7 @@ name: smoke test on: + pull_request: ~ workflow_dispatch: schedule: - cron: 0 22 * * * From 261c7c0a61d3cb599782418a0bafc6c599d1b66c Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 15:54:59 +0200 Subject: [PATCH 04/32] add precompile --- .github/workflows/smoke-test.yml | 5 -- .gitignore | 1 + pnpm-lock.yaml | 101 +++++++++++++++++++++++++------ tests/smoke-test/package.json | 1 + tests/smoke-test/tsconfig.json | 4 +- 5 files changed, 88 insertions(+), 24 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 84f6d468..912a6e99 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -27,12 +27,7 @@ jobs: # echo "aicore='$aicore'" > tests/e2e-tests/.env # url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') # echo "Using AI Core ${{ matrix.environment }} instance on $url" - - name: setup app - run: | - pnpm run create-deployment - pnpm run compile - uses: vchrisb/setup-cf@v0 - name: deloy to CF with: api: ${{ secrets.CF_API_URL }} username: ${{ secrets.CF_USER }} diff --git a/.gitignore b/.gitignore index 4ed3ea34..53316f7d 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ build/Release # VS Code .vscode /pnpm-publish-summary.json +/tests/smoke-test/deployment diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe3a9f35..1a9c6d9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,6 +151,28 @@ importers: specifier: ^16.4.5 version: 16.4.5 + tests/smoke-test: + dependencies: + '@sap-ai-sdk/ai-core': + specifier: canary + version: 0.0.1-20240819013036.0 + '@sap-ai-sdk/gen-ai-hub': + specifier: canary + version: 0.0.1-20240819013036.0 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + express: + specifier: ^4.19.2 + version: 4.19.2 + devDependencies: + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + dotenv-cli: + specifier: ^7.4.2 + version: 7.4.2 + tests/type-tests: devDependencies: '@sap-ai-sdk/core': @@ -643,6 +665,15 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@sap-ai-sdk/ai-core@0.0.1-20240819013036.0': + resolution: {integrity: sha512-tyg68JcFAUfnWMPycbMIWSOkVfUaDICGMhTRDSWeISRrCtZTiMe9u0YyskAPsX6F5n5vwGuvxqw2ZacW+7E0UQ==} + + '@sap-ai-sdk/core@0.0.1-20240819013036.0': + resolution: {integrity: sha512-jpectHL/Wgbrr024+57UTNUrhPjn1svZG0YcnEg7VJEFDd1yHmjiNYMF1e7FDNQQgW+/09yIrUoGq+pgii97sQ==} + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240819013036.0': + resolution: {integrity: sha512-5VU0ouTtHSwbK/OeG7LQZd1N/KDgXzgxcrkrwrfqb3F68AgsbOGYZjHXUw007Yk3dfKACPIs+2QJp6TNF0VULA==} + '@sap-cloud-sdk/connectivity@3.18.1': resolution: {integrity: sha512-HCOBlq4kc1ZgctyEYFnslC5kOMuQ6OLanfMvVWK7mGvs6WscitegZS1R+IojUVmbRW8wWrnE1rrpd7yMXnZlhg==} @@ -778,9 +809,6 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.14.15': - resolution: {integrity: sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==} - '@types/node@20.16.0': resolution: {integrity: sha512-vDxceJcoZhIVh67S568bm1UGZO0DX0hpplJZxzeXMKwIPLn190ec5RRxQ69BKhX44SUGIxxgMdDY557lGLKprQ==} @@ -1331,6 +1359,14 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dotenv-cli@7.4.2: + resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -3230,9 +3266,6 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.19.6: resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} @@ -4168,6 +4201,37 @@ snapshots: '@pkgr/core@0.1.1': {} + '@sap-ai-sdk/ai-core@0.0.1-20240819013036.0': + dependencies: + '@sap-ai-sdk/core': 0.0.1-20240819013036.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/core@0.0.1-20240819013036.0': + dependencies: + '@sap-cloud-sdk/connectivity': 3.18.1 + '@sap-cloud-sdk/http-client': 3.18.1 + '@sap-cloud-sdk/openapi': 3.18.1 + '@sap-cloud-sdk/util': 3.18.1 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240819013036.0': + dependencies: + '@sap-ai-sdk/core': 0.0.1-20240819013036.0 + '@sap-cloud-sdk/connectivity': 3.18.1 + '@sap-cloud-sdk/http-client': 3.18.1 + '@sap-cloud-sdk/openapi': 3.18.1 + '@sap-cloud-sdk/util': 3.18.1 + transitivePeerDependencies: + - debug + - encoding + - supports-color + '@sap-cloud-sdk/connectivity@3.18.1': dependencies: '@sap-cloud-sdk/resilience': 3.18.1 @@ -4340,11 +4404,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.14.15 + '@types/node': 20.16.0 '@types/connect@3.4.38': dependencies: - '@types/node': 20.14.15 + '@types/node': 20.16.0 '@types/eslint@7.29.0': dependencies: @@ -4361,7 +4425,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.14.15 + '@types/node': 20.16.0 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4408,10 +4472,6 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.14.15': - dependencies: - undici-types: 5.26.5 - '@types/node@20.16.0': dependencies: undici-types: 6.19.6 @@ -4427,12 +4487,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.14.15 + '@types/node': 20.16.0 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.14.15 + '@types/node': 20.16.0 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -4995,6 +5055,15 @@ snapshots: dependencies: esutils: 2.0.3 + dotenv-cli@7.4.2: + dependencies: + cross-spawn: 7.0.3 + dotenv: 16.4.5 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + + dotenv-expand@10.0.0: {} + dotenv@16.4.5: {} eastasianwidth@0.2.0: {} @@ -7244,8 +7313,6 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} - undici-types@6.19.6: {} universalify@0.1.2: {} diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json index 5867053a..81d1df63 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-test/package.json @@ -7,6 +7,7 @@ "private": "true", "scripts": { "start": "node dist/server.js", + "precompile": "pnpm create-deployment", "compile": "tsc", "create-deployment": "rm -rf deployment dist && cp -r ../../sample-code/src ./deployment && cp ./package.json ./deployment", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", diff --git a/tests/smoke-test/tsconfig.json b/tests/smoke-test/tsconfig.json index 93ce334b..92cf7b01 100644 --- a/tests/smoke-test/tsconfig.json +++ b/tests/smoke-test/tsconfig.json @@ -6,6 +6,6 @@ "tsBuildInfoFile": "./dist/.tsbuildinfo", "composite": true }, - "include": ["**/*.ts"], - "exclude": ["dist/**/*", "node_modules/**/*"] + "include": ["deployment/**/*.ts"], + "exclude": ["dist/**/*", "node_modules/**/*", "test/**/*"] } From 40c16885f94b2aad1df9ff8640a6eb5b4d064342 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 15:56:15 +0200 Subject: [PATCH 05/32] fix typo --- .github/workflows/smoke-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 912a6e99..8fdbce92 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -29,7 +29,7 @@ jobs: # echo "Using AI Core ${{ matrix.environment }} instance on $url" - uses: vchrisb/setup-cf@v0 with: - api: ${{ secrets.CF_API_URL }} + api: ${{ vars.CF_API_URL }} username: ${{ secrets.CF_USER }} password: ${{ secrets.CF_PASSWORD }} org: ${{ vars.CF_ORG }} From 7d017f5d727fdc9353e369e81aef7d919109acc5 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 15:58:23 +0200 Subject: [PATCH 06/32] fsd --- .github/workflows/smoke-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 8fdbce92..d8ee2840 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -27,6 +27,8 @@ jobs: # echo "aicore='$aicore'" > tests/e2e-tests/.env # url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') # echo "Using AI Core ${{ matrix.environment }} instance on $url" + - name: debug + run: ls -la - uses: vchrisb/setup-cf@v0 with: api: ${{ vars.CF_API_URL }} From 741fd313c4efd37c7cd364c78fdf27a0c1570a97 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 16:01:50 +0200 Subject: [PATCH 07/32] again --- .github/workflows/smoke-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index d8ee2840..6304ef1e 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -36,6 +36,6 @@ jobs: password: ${{ secrets.CF_PASSWORD }} org: ${{ vars.CF_ORG }} space: ${{ vars.CF_SPACE }} - command: push + - run: pnpm smoke-test run cf-push - name: smoke test run: pnpm test:smoke From 081e37e36449eb80aae62d4bb38b2c342266e6d1 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 16:08:04 +0200 Subject: [PATCH 08/32] remove unnecessary command --- .github/workflows/smoke-test.yml | 2 +- tests/smoke-test/package.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 6304ef1e..b7af272d 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -36,6 +36,6 @@ jobs: password: ${{ secrets.CF_PASSWORD }} org: ${{ vars.CF_ORG }} space: ${{ vars.CF_SPACE }} - - run: pnpm smoke-test run cf-push + - run: pnpm smoke-test run cf push - name: smoke test run: pnpm test:smoke diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json index 81d1df63..42a3bcaf 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-test/package.json @@ -11,7 +11,6 @@ "compile": "tsc", "create-deployment": "rm -rf deployment dist && cp -r ../../sample-code/src ./deployment && cp ./package.json ./deployment", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", - "cf-push": "cf push", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" From e2c3198414a02988f12f3e93896e40c5f2dca7c3 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 16:13:57 +0200 Subject: [PATCH 09/32] fix deployment --- tests/smoke-test/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json index 42a3bcaf..b36ab318 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-test/package.json @@ -9,7 +9,7 @@ "start": "node dist/server.js", "precompile": "pnpm create-deployment", "compile": "tsc", - "create-deployment": "rm -rf deployment dist && cp -r ../../sample-code/src ./deployment && cp ./package.json ./deployment", + "create-deployment": "rm -rf deployment && cp -r ../../sample-code/src ./deployment", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", From 1048876b133f73b3cfe2b9867411a3182e360c1f Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 16:20:34 +0200 Subject: [PATCH 10/32] add debug logs --- .github/workflows/smoke-test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index b7af272d..86e3d794 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -27,8 +27,6 @@ jobs: # echo "aicore='$aicore'" > tests/e2e-tests/.env # url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') # echo "Using AI Core ${{ matrix.environment }} instance on $url" - - name: debug - run: ls -la - uses: vchrisb/setup-cf@v0 with: api: ${{ vars.CF_API_URL }} @@ -36,6 +34,8 @@ jobs: password: ${{ secrets.CF_PASSWORD }} org: ${{ vars.CF_ORG }} space: ${{ vars.CF_SPACE }} - - run: pnpm smoke-test run cf push + - run: | + cf apps + pnpm smoke-test run cf push - name: smoke test run: pnpm test:smoke From cf25ac4b4efd5a175cdd718c62ebd3e29cd5dca5 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 16:22:29 +0200 Subject: [PATCH 11/32] fix push --- .github/workflows/smoke-test.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 86e3d794..f1ed0a70 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -34,8 +34,7 @@ jobs: password: ${{ secrets.CF_PASSWORD }} org: ${{ vars.CF_ORG }} space: ${{ vars.CF_SPACE }} - - run: | - cf apps - pnpm smoke-test run cf push + - run: cf push + working-directory: tests/smoke-test - name: smoke test run: pnpm test:smoke From 69dce1e798aad16bac549997514944da7635f342 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 19 Aug 2024 17:36:50 +0200 Subject: [PATCH 12/32] fix tests --- sample-code/src/orchestration.ts | 23 +++++++++++++++++++++++ sample-code/src/server.ts | 12 ++++++++++-- tests/smoke-test/.cfignore | 4 ++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 sample-code/src/orchestration.ts create mode 100644 tests/smoke-test/.cfignore diff --git a/sample-code/src/orchestration.ts b/sample-code/src/orchestration.ts new file mode 100644 index 00000000..72bcf6ba --- /dev/null +++ b/sample-code/src/orchestration.ts @@ -0,0 +1,23 @@ +import { + type CompletionPostResponse, + GenAiHubClient +} from '@sap-ai-sdk/gen-ai-hub'; + +/** + * Ask GPT about the capital of France. + * @returns The answer from the orchestration service in Gen AI Hub. + */ +export function orchestrationCompletion(): Promise { + const genAiHubClient = new GenAiHubClient(); + + return genAiHubClient.chatCompletion({ + deploymentConfiguration: { deploymentId: 'db1d64d9f06be467' }, + llmConfig: { + model_name: 'gpt-4-32k', + model_params: {} + }, + prompt: { + template: [{ role: 'user', content: 'What is the capital of France?' }] + } + }); +} diff --git a/sample-code/src/server.ts b/sample-code/src/server.ts index 06c3bc6b..fdc01efa 100644 --- a/sample-code/src/server.ts +++ b/sample-code/src/server.ts @@ -1,6 +1,7 @@ /* eslint-disable no-console */ import express from 'express'; import { chatCompletion, computeEmbedding } from './aiservice.js'; +import { orchestrationCompletion } from './orchestration.js'; const app = express(); const port = 8080; @@ -35,8 +36,15 @@ app.get('/embedding', async (req, res) => { } }); -app.get('/orchestration', (req, res) => { - res.status(418).send('Not implemented 🛠️'); +app.get('/orchestration', async (req, res) => { + try { + res.send(await orchestrationCompletion()); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently 😬 -> ' + error.message); + } }); app.listen(port, () => { diff --git a/tests/smoke-test/.cfignore b/tests/smoke-test/.cfignore new file mode 100644 index 00000000..cccc3aea --- /dev/null +++ b/tests/smoke-test/.cfignore @@ -0,0 +1,4 @@ +coverage/ +jest.config.mjs +tsconfig.json +.env \ No newline at end of file From fccf6eed28745e3da1061548ca0a38eaf8a3e29e Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:28:51 +0200 Subject: [PATCH 13/32] Update .github/workflows/smoke-test.yml --- .github/workflows/smoke-test.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index f1ed0a70..a76f5dc8 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -19,14 +19,6 @@ jobs: node-version: ${{ vars.DEFAULT_NODE_VERSION }} cache: 'pnpm' - run: pnpm i --frozen-lockfile - # - name: Create .env file - # env: - # aicore: ${{ secrets[matrix.secret-name] }} - # run: | - # echo "aicore='$aicore'" > sample-code/.env - # echo "aicore='$aicore'" > tests/e2e-tests/.env - # url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') - # echo "Using AI Core ${{ matrix.environment }} instance on $url" - uses: vchrisb/setup-cf@v0 with: api: ${{ vars.CF_API_URL }} From 940a7fad768830b0c46f479d1773f0162fe805f6 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:56:46 +0200 Subject: [PATCH 14/32] Update tests/smoke-test/.cfignore --- tests/smoke-test/.cfignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-test/.cfignore b/tests/smoke-test/.cfignore index cccc3aea..a54e327a 100644 --- a/tests/smoke-test/.cfignore +++ b/tests/smoke-test/.cfignore @@ -1,4 +1,4 @@ coverage/ jest.config.mjs tsconfig.json -.env \ No newline at end of file +.env From d515925f122d9a5fa04b40d1fc3cd36efd113534 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 20 Aug 2024 12:09:20 +0200 Subject: [PATCH 15/32] fix config --- tests/e2e-tests/package.json | 4 ++-- tests/smoke-test/jest.config.mjs | 10 ++++++++++ tests/smoke-test/package.json | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/e2e-tests/package.json b/tests/e2e-tests/package.json index 5ff06378..fce04efc 100644 --- a/tests/e2e-tests/package.json +++ b/tests/e2e-tests/package.json @@ -20,8 +20,8 @@ "scripts": { "compile": "tsc", "test": "NODE_OPTIONS=--experimental-vm-modules jest", - "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", - "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" + "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", + "lint:fix": "eslint . --fix && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" }, "devDependencies": { "dotenv": "^16.4.5" diff --git a/tests/smoke-test/jest.config.mjs b/tests/smoke-test/jest.config.mjs index 0066bc52..31fbf7f4 100644 --- a/tests/smoke-test/jest.config.mjs +++ b/tests/smoke-test/jest.config.mjs @@ -1,5 +1,15 @@ import config from '../../jest.config.mjs'; export default { ...config, + globalSetup: undefined, + globalTeardown: undefined, displayName: 'smoke-test', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, }; diff --git a/tests/smoke-test/package.json b/tests/smoke-test/package.json index b36ab318..91e10dd8 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-test/package.json @@ -12,8 +12,8 @@ "create-deployment": "rm -rf deployment && cp -r ../../sample-code/src ./deployment", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", "test": "NODE_OPTIONS=--experimental-vm-modules jest", - "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", - "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" + "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", + "lint:fix": "eslint . --fix && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" }, "dependencies": { "@sap-ai-sdk/ai-core": "canary", From bbd7a8627b7fb844f30e403b1c23834a0e07ea0b Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 20 Aug 2024 14:46:46 +0200 Subject: [PATCH 16/32] actually add ai core tests --- pnpm-lock.yaml | 3 +++ sample-code/package.json | 15 ++++++++------- sample-code/src/ai-core.ts | 14 ++++++++++++++ sample-code/src/server.ts | 11 +++++++++++ tests/smoke-test/test/smoke.test.ts | 11 +++++------ 5 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 sample-code/src/ai-core.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a9c6d9d..9610bbdf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,6 +122,9 @@ importers: sample-code: dependencies: + '@sap-ai-sdk/ai-core': + specifier: workspace:^ + version: link:../packages/ai-core '@sap-ai-sdk/gen-ai-hub': specifier: workspace:^ version: link:../packages/gen-ai-hub diff --git a/sample-code/package.json b/sample-code/package.json index 50bcc856..1ddfdc01 100644 --- a/sample-code/package.json +++ b/sample-code/package.json @@ -3,11 +3,6 @@ "name": "@sap-ai-sdk/sample-code", "version": "0.0.0", "private": "true", - "dependencies": { - "@sap-ai-sdk/gen-ai-hub": "workspace:^", - "@types/express": "^4.17.21", - "express": "^4.19.2" - }, "main": "./dist/index.js", "types": "./dist/index.d.ts", "files": [ @@ -16,6 +11,9 @@ "dist/**/*.d.ts", "dist/**/*.d.ts.map" ], + "engines": { + "node": "^20" + }, "scripts": { "start": "node --loader ts-node/esm src/server.ts", "local": "node --env-file=.env --loader ts-node/esm src/server.ts", @@ -24,7 +22,10 @@ "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -w --log-level error" }, - "engines": { - "node": "^20" + "dependencies": { + "@sap-ai-sdk/gen-ai-hub": "workspace:^", + "@sap-ai-sdk/ai-core": "workspace:^", + "@types/express": "^4.17.21", + "express": "^4.19.2" } } diff --git a/sample-code/src/ai-core.ts b/sample-code/src/ai-core.ts new file mode 100644 index 00000000..38cd321b --- /dev/null +++ b/sample-code/src/ai-core.ts @@ -0,0 +1,14 @@ +import { AiDeployment, DeploymentApi } from '@sap-ai-sdk/ai-core'; + +/** + * Get all deployments. + * @returns All deployments. + */ +export async function getDeployments(): Promise { + const { data } = await DeploymentApi.deploymentQuery( + {}, + { 'AI-Resource-Group': 'default' } + ).execute(); + + return data; +} diff --git a/sample-code/src/server.ts b/sample-code/src/server.ts index fdc01efa..71899960 100644 --- a/sample-code/src/server.ts +++ b/sample-code/src/server.ts @@ -47,6 +47,17 @@ app.get('/orchestration', async (req, res) => { } }); +app.get('/ai-core/get-deployments', async (req, res) => { + try { + res.send(await chatCompletion()); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently 😬 -> ' + error.message); + } +}); + app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); }); diff --git a/tests/smoke-test/test/smoke.test.ts b/tests/smoke-test/test/smoke.test.ts index a0999cb3..5068217e 100644 --- a/tests/smoke-test/test/smoke.test.ts +++ b/tests/smoke-test/test/smoke.test.ts @@ -1,14 +1,13 @@ const smokeTestRoute = 'https://smoke-test-app.cfapps.eu12-001.hana.ondemand.com'; describe('Smoke Test', () => { - it('aicore', async () => { - await expect(fetch(`${smokeTestRoute}/llm`)).resolves.toHaveProperty( - 'status', - 200 - ); + it('aicore client retrieves a list of deployments', async () => { + await expect( + fetch(`${smokeTestRoute}/ai-core/get-deployments`) + ).resolves.toHaveProperty('status', 200); }); - it('orchestration', async () => { + it('orchestration client retrieves completion results', async () => { await expect( fetch(`${smokeTestRoute}/orchestration`) ).resolves.toHaveProperty('status', 200); From 789c1db4411b0db45cc7b7648479c80fc4e70e61 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 20 Aug 2024 14:57:23 +0200 Subject: [PATCH 17/32] adjust configs --- .../{smoke-test.yml => smoke-tests.yml} | 4 +-- .gitignore | 2 +- package.json | 12 ++++----- pnpm-lock.yaml | 26 +++++++++---------- pnpm-workspace.yaml | 2 +- tests/e2e-tests/jest.config.mjs | 9 +------ tests/smoke-test/jest.config.mjs | 15 ----------- tests/{smoke-test => smoke-tests}/.cfignore | 0 tests/smoke-tests/jest.config.mjs | 7 +++++ .../{smoke-test => smoke-tests}/manifest.yml | 0 .../{smoke-test => smoke-tests}/package.json | 2 +- .../test/smoke.test.ts | 0 .../{smoke-test => smoke-tests}/tsconfig.json | 0 13 files changed, 32 insertions(+), 47 deletions(-) rename .github/workflows/{smoke-test.yml => smoke-tests.yml} (92%) delete mode 100644 tests/smoke-test/jest.config.mjs rename tests/{smoke-test => smoke-tests}/.cfignore (100%) create mode 100644 tests/smoke-tests/jest.config.mjs rename tests/{smoke-test => smoke-tests}/manifest.yml (100%) rename tests/{smoke-test => smoke-tests}/package.json (96%) rename tests/{smoke-test => smoke-tests}/test/smoke.test.ts (100%) rename tests/{smoke-test => smoke-tests}/tsconfig.json (100%) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-tests.yml similarity index 92% rename from .github/workflows/smoke-test.yml rename to .github/workflows/smoke-tests.yml index a76f5dc8..ad58dfc8 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-tests.yml @@ -7,7 +7,7 @@ on: - cron: 0 22 * * * jobs: - smoke-test: + smoke-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -27,6 +27,6 @@ jobs: org: ${{ vars.CF_ORG }} space: ${{ vars.CF_SPACE }} - run: cf push - working-directory: tests/smoke-test + working-directory: tests/smoke-tests - name: smoke test run: pnpm test:smoke diff --git a/.gitignore b/.gitignore index 53316f7d..2ab4d1bf 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,4 @@ build/Release # VS Code .vscode /pnpm-publish-summary.json -/tests/smoke-test/deployment +/tests/smoke-tests/deployment diff --git a/package.json b/package.json index 878859d0..20cc73b7 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test:unit": "pnpm -r -F=./packages/** test", "test:type": "pnpm type-tests test", "test:e2e": "pnpm e2e-tests test", - "test:smoke": "pnpm smoke-test test", + "test:smoke": "pnpm smoke-tests test", "lint": "pnpm -r run lint", "lint:fix": "pnpm -r run lint:fix", "generate": "pnpm -r run generate", @@ -22,25 +22,25 @@ "core": "pnpm -F=@sap-ai-sdk/core", "e2e-tests": "pnpm -F=@sap-ai-sdk/e2e-tests", "type-tests": "pnpm -F=@sap-ai-sdk/type-tests", - "smoke-test": "pnpm -F=@sap-ai-sdk/smoke-test" + "smoke-tests": "pnpm -F=@sap-ai-sdk/smoke-tests" }, "devDependencies": { "@changesets/cli": "^2.27.7", + "@jest/globals": "^29.5.12", "@sap-cloud-sdk/eslint-config": "^3.18.1", "@sap-cloud-sdk/connectivity": "^3.18.1", "@sap-cloud-sdk/http-client": "^3.18.1", "@sap-ai-sdk/core": "workspace:^", "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.2", "@types/node": "^20.16.0", - "@jest/globals": "^29.5.12", "eslint": "^9.9.0", "jest": "^30.0.0-alpha.6", + "jsonwebtoken": "^9.0.2", "nock": "^13.5.4", "prettier": "^3.3.3", "ts-jest": "^29.2.4", "ts-node": "^10.9.2", - "typescript": "^5.5.4", - "jsonwebtoken": "^9.0.2", - "@types/jsonwebtoken": "^9.0.2" + "typescript": "^5.5.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9610bbdf..2ad656f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,10 +158,10 @@ importers: dependencies: '@sap-ai-sdk/ai-core': specifier: canary - version: 0.0.1-20240819013036.0 + version: 0.0.1-20240820013011.0 '@sap-ai-sdk/gen-ai-hub': specifier: canary - version: 0.0.1-20240819013036.0 + version: 0.0.1-20240820013011.0 '@types/express': specifier: ^4.17.21 version: 4.17.21 @@ -668,14 +668,14 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@sap-ai-sdk/ai-core@0.0.1-20240819013036.0': - resolution: {integrity: sha512-tyg68JcFAUfnWMPycbMIWSOkVfUaDICGMhTRDSWeISRrCtZTiMe9u0YyskAPsX6F5n5vwGuvxqw2ZacW+7E0UQ==} + '@sap-ai-sdk/ai-core@0.0.1-20240820013011.0': + resolution: {integrity: sha512-42BoQ9rEp+WzSwhW4dypI2vGf9vjfE83uOnMs2HHPxxEmJJ017/a6UVy0g4zY7URGcoe4K8BcMVrgtkNmEwDgQ==} - '@sap-ai-sdk/core@0.0.1-20240819013036.0': - resolution: {integrity: sha512-jpectHL/Wgbrr024+57UTNUrhPjn1svZG0YcnEg7VJEFDd1yHmjiNYMF1e7FDNQQgW+/09yIrUoGq+pgii97sQ==} + '@sap-ai-sdk/core@0.0.1-20240820013011.0': + resolution: {integrity: sha512-G4ptbWGIryQId/81XXGukY8RQJHKuF9zYLblyUgxltL2gAG7oC8PHJXqvDCCbfVmlLvxyc1ENr3+e5bsP5p5BQ==} - '@sap-ai-sdk/gen-ai-hub@0.0.1-20240819013036.0': - resolution: {integrity: sha512-5VU0ouTtHSwbK/OeG7LQZd1N/KDgXzgxcrkrwrfqb3F68AgsbOGYZjHXUw007Yk3dfKACPIs+2QJp6TNF0VULA==} + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240820013011.0': + resolution: {integrity: sha512-8HKlLlM7ZH1R0r8d982TIH6IRuyQwankGdI3emMgOeDoiI+b03C/g/0eA+IJ3dNb+bEBBcbd0q77wfOiPzHENg==} '@sap-cloud-sdk/connectivity@3.18.1': resolution: {integrity: sha512-HCOBlq4kc1ZgctyEYFnslC5kOMuQ6OLanfMvVWK7mGvs6WscitegZS1R+IojUVmbRW8wWrnE1rrpd7yMXnZlhg==} @@ -4204,15 +4204,15 @@ snapshots: '@pkgr/core@0.1.1': {} - '@sap-ai-sdk/ai-core@0.0.1-20240819013036.0': + '@sap-ai-sdk/ai-core@0.0.1-20240820013011.0': dependencies: - '@sap-ai-sdk/core': 0.0.1-20240819013036.0 + '@sap-ai-sdk/core': 0.0.1-20240820013011.0 transitivePeerDependencies: - debug - encoding - supports-color - '@sap-ai-sdk/core@0.0.1-20240819013036.0': + '@sap-ai-sdk/core@0.0.1-20240820013011.0': dependencies: '@sap-cloud-sdk/connectivity': 3.18.1 '@sap-cloud-sdk/http-client': 3.18.1 @@ -4223,9 +4223,9 @@ snapshots: - encoding - supports-color - '@sap-ai-sdk/gen-ai-hub@0.0.1-20240819013036.0': + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240820013011.0': dependencies: - '@sap-ai-sdk/core': 0.0.1-20240819013036.0 + '@sap-ai-sdk/core': 0.0.1-20240820013011.0 '@sap-cloud-sdk/connectivity': 3.18.1 '@sap-cloud-sdk/http-client': 3.18.1 '@sap-cloud-sdk/openapi': 3.18.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 72c805a1..3139fac4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,4 +6,4 @@ packages: - 'sample-code' - 'tests/e2e-tests' - 'tests/type-tests' - - 'tests/smoke-test' + - 'tests/smoke-tests' diff --git a/tests/e2e-tests/jest.config.mjs b/tests/e2e-tests/jest.config.mjs index b10d09ea..42507be6 100644 --- a/tests/e2e-tests/jest.config.mjs +++ b/tests/e2e-tests/jest.config.mjs @@ -1,15 +1,8 @@ import config from '../../jest.config.mjs'; + export default { ...config, globalSetup: undefined, globalTeardown: undefined, displayName: 'e2e-tests', - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, }; diff --git a/tests/smoke-test/jest.config.mjs b/tests/smoke-test/jest.config.mjs deleted file mode 100644 index 31fbf7f4..00000000 --- a/tests/smoke-test/jest.config.mjs +++ /dev/null @@ -1,15 +0,0 @@ -import config from '../../jest.config.mjs'; -export default { - ...config, - globalSetup: undefined, - globalTeardown: undefined, - displayName: 'smoke-test', - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, -}; diff --git a/tests/smoke-test/.cfignore b/tests/smoke-tests/.cfignore similarity index 100% rename from tests/smoke-test/.cfignore rename to tests/smoke-tests/.cfignore diff --git a/tests/smoke-tests/jest.config.mjs b/tests/smoke-tests/jest.config.mjs new file mode 100644 index 00000000..f6efae64 --- /dev/null +++ b/tests/smoke-tests/jest.config.mjs @@ -0,0 +1,7 @@ +import config from '../../jest.config.mjs'; +export default { + ...config, + globalSetup: undefined, + globalTeardown: undefined, + displayName: 'smoke-tests, +}; diff --git a/tests/smoke-test/manifest.yml b/tests/smoke-tests/manifest.yml similarity index 100% rename from tests/smoke-test/manifest.yml rename to tests/smoke-tests/manifest.yml diff --git a/tests/smoke-test/package.json b/tests/smoke-tests/package.json similarity index 96% rename from tests/smoke-test/package.json rename to tests/smoke-tests/package.json index 91e10dd8..de9778b7 100644 --- a/tests/smoke-test/package.json +++ b/tests/smoke-tests/package.json @@ -1,6 +1,6 @@ { "type": "module", - "name": "@sap-ai-sdk/smoke-test", + "name": "@sap-ai-sdk/smoke-tests", "version": "0.0.0", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/tests/smoke-test/test/smoke.test.ts b/tests/smoke-tests/test/smoke.test.ts similarity index 100% rename from tests/smoke-test/test/smoke.test.ts rename to tests/smoke-tests/test/smoke.test.ts diff --git a/tests/smoke-test/tsconfig.json b/tests/smoke-tests/tsconfig.json similarity index 100% rename from tests/smoke-test/tsconfig.json rename to tests/smoke-tests/tsconfig.json From d0b4f0921b6fa8e42a8f78504df2b3bfb6e874d7 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 20 Aug 2024 15:05:16 +0200 Subject: [PATCH 18/32] fw --- tests/smoke-tests/jest.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-tests/jest.config.mjs b/tests/smoke-tests/jest.config.mjs index f6efae64..a1337ac9 100644 --- a/tests/smoke-tests/jest.config.mjs +++ b/tests/smoke-tests/jest.config.mjs @@ -3,5 +3,5 @@ export default { ...config, globalSetup: undefined, globalTeardown: undefined, - displayName: 'smoke-tests, + displayName: 'smoke-tests', }; From f1cc43519960d44b293dd47ba9d783f65f62897f Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Wed, 21 Aug 2024 10:01:23 +0200 Subject: [PATCH 19/32] Add a readme --- tests/smoke-tests/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/smoke-tests/README.md diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md new file mode 100644 index 00000000..c40570ee --- /dev/null +++ b/tests/smoke-tests/README.md @@ -0,0 +1,34 @@ +# Smoke Tests + +The purpose of the smoke tests is to find obvious issues in the e2e process of using the SAP Cloud SDK for AI libs. + +The sample code app is running on Cloud Foundry and uses the current canary version of the SAP Cloud SDK for AI. + +## Deploying a new version of the sample code app + +The sample code app is deployed to SAP BTP nightly. +To deploy a new version of the sample code app manually, make sure to provide your own `.env` file in the `test/smoke-tests` subdirectory with the following environment variables: + +- CF_API_URL +- CF_USER +- CF_PASSWORD +- CF_ORG +- CF_SPACE + +Then, run: + +```bash +pnpm smoke-tests create-deployment +pnpm smoke-tests cf-login +pnpm smoke-tests exec cf push +``` + +This copies the `dist` directory of the sample code app, logs in to SAP BTP and pushes the application using the CF CLI. + +## Running the tests + +To run the tests, run: + +``` +pnpm test:smoke +``` From 6e4266899d1c3907527e0f603f9b603d00fe9620 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Thu, 22 Aug 2024 10:39:48 +0200 Subject: [PATCH 20/32] make sure tests run with new version every day --- .pnpmfile.cjs | 20 ++++++++++++ pnpm-lock.yaml | 56 ++++----------------------------- tests/smoke-tests/.cfignore | 2 ++ tests/smoke-tests/README.md | 4 +++ tests/smoke-tests/package.json | 7 ++--- tests/smoke-tests/tsconfig.json | 11 ------- 6 files changed, 35 insertions(+), 65 deletions(-) create mode 100644 .pnpmfile.cjs delete mode 100644 tests/smoke-tests/tsconfig.json diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs new file mode 100644 index 00000000..2e1e5cf8 --- /dev/null +++ b/.pnpmfile.cjs @@ -0,0 +1,20 @@ +module.exports = { + hooks: { + afterAllResolved: async lockfile => { + Object.keys(lockfile.packages) + .filter(pkg => pkg.startsWith('@sap-ai-sdk')) + .forEach(pkg => { + delete lockfile.packages[pkg]; + }); + + delete lockfile.importers['tests/smoke-tests'].dependencies[ + '@sap-ai-sdk/ai-core' + ]; + delete lockfile.importers['tests/smoke-tests'].dependencies[ + '@sap-ai-sdk/gen-ai-hub' + ]; + + return lockfile; + } + } +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ad656f2..676ff6f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,8 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +pnpmfileChecksum: npnjno6go7hyivfolifkve5zla + importers: .: @@ -154,21 +156,15 @@ importers: specifier: ^16.4.5 version: 16.4.5 - tests/smoke-test: + tests/smoke-tests: dependencies: - '@sap-ai-sdk/ai-core': - specifier: canary - version: 0.0.1-20240820013011.0 - '@sap-ai-sdk/gen-ai-hub': - specifier: canary - version: 0.0.1-20240820013011.0 - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 express: specifier: ^4.19.2 version: 4.19.2 devDependencies: + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -668,15 +664,6 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@sap-ai-sdk/ai-core@0.0.1-20240820013011.0': - resolution: {integrity: sha512-42BoQ9rEp+WzSwhW4dypI2vGf9vjfE83uOnMs2HHPxxEmJJ017/a6UVy0g4zY7URGcoe4K8BcMVrgtkNmEwDgQ==} - - '@sap-ai-sdk/core@0.0.1-20240820013011.0': - resolution: {integrity: sha512-G4ptbWGIryQId/81XXGukY8RQJHKuF9zYLblyUgxltL2gAG7oC8PHJXqvDCCbfVmlLvxyc1ENr3+e5bsP5p5BQ==} - - '@sap-ai-sdk/gen-ai-hub@0.0.1-20240820013011.0': - resolution: {integrity: sha512-8HKlLlM7ZH1R0r8d982TIH6IRuyQwankGdI3emMgOeDoiI+b03C/g/0eA+IJ3dNb+bEBBcbd0q77wfOiPzHENg==} - '@sap-cloud-sdk/connectivity@3.18.1': resolution: {integrity: sha512-HCOBlq4kc1ZgctyEYFnslC5kOMuQ6OLanfMvVWK7mGvs6WscitegZS1R+IojUVmbRW8wWrnE1rrpd7yMXnZlhg==} @@ -4204,37 +4191,6 @@ snapshots: '@pkgr/core@0.1.1': {} - '@sap-ai-sdk/ai-core@0.0.1-20240820013011.0': - dependencies: - '@sap-ai-sdk/core': 0.0.1-20240820013011.0 - transitivePeerDependencies: - - debug - - encoding - - supports-color - - '@sap-ai-sdk/core@0.0.1-20240820013011.0': - dependencies: - '@sap-cloud-sdk/connectivity': 3.18.1 - '@sap-cloud-sdk/http-client': 3.18.1 - '@sap-cloud-sdk/openapi': 3.18.1 - '@sap-cloud-sdk/util': 3.18.1 - transitivePeerDependencies: - - debug - - encoding - - supports-color - - '@sap-ai-sdk/gen-ai-hub@0.0.1-20240820013011.0': - dependencies: - '@sap-ai-sdk/core': 0.0.1-20240820013011.0 - '@sap-cloud-sdk/connectivity': 3.18.1 - '@sap-cloud-sdk/http-client': 3.18.1 - '@sap-cloud-sdk/openapi': 3.18.1 - '@sap-cloud-sdk/util': 3.18.1 - transitivePeerDependencies: - - debug - - encoding - - supports-color - '@sap-cloud-sdk/connectivity@3.18.1': dependencies: '@sap-cloud-sdk/resilience': 3.18.1 diff --git a/tests/smoke-tests/.cfignore b/tests/smoke-tests/.cfignore index a54e327a..16238800 100644 --- a/tests/smoke-tests/.cfignore +++ b/tests/smoke-tests/.cfignore @@ -1,4 +1,6 @@ +test/ coverage/ +node_modules/ jest.config.mjs tsconfig.json .env diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index c40570ee..c38c66c1 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -32,3 +32,7 @@ To run the tests, run: ``` pnpm test:smoke ``` + +## Running the app locally + + diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index de9778b7..a4fb0f24 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -7,9 +7,8 @@ "private": "true", "scripts": { "start": "node dist/server.js", - "precompile": "pnpm create-deployment", - "compile": "tsc", - "create-deployment": "rm -rf deployment && cp -r ../../sample-code/src ./deployment", + "add-canary": "pnpm add @sap-ai-sdk/ai-core@canary --save-prod=false --save-dev=false && pnpm add @sap-ai-sdk/gen-ai-hub@canary --save-prod=false --save-dev=false", + "create-deployment": "pnpm add-canary && rm -rf dist && cp ../../sample-code/dist dist", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", @@ -18,10 +17,10 @@ "dependencies": { "@sap-ai-sdk/ai-core": "canary", "@sap-ai-sdk/gen-ai-hub": "canary", - "@types/express": "^4.17.21", "express": "^4.19.2" }, "devDependencies": { + "@types/express": "^4.17.21", "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2" } diff --git a/tests/smoke-tests/tsconfig.json b/tests/smoke-tests/tsconfig.json deleted file mode 100644 index 92cf7b01..00000000 --- a/tests/smoke-tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./deployment", - "outDir": "./dist", - "tsBuildInfoFile": "./dist/.tsbuildinfo", - "composite": true - }, - "include": ["deployment/**/*.ts"], - "exclude": ["dist/**/*", "node_modules/**/*", "test/**/*"] -} From 257acf0584acd3463bf9a614bf9a588afa567386 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Thu, 22 Aug 2024 10:47:38 +0200 Subject: [PATCH 21/32] make script more generic --- .pnpmfile.cjs | 11 +++++------ pnpm-lock.yaml | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs index 2e1e5cf8..cd7b267f 100644 --- a/.pnpmfile.cjs +++ b/.pnpmfile.cjs @@ -7,12 +7,11 @@ module.exports = { delete lockfile.packages[pkg]; }); - delete lockfile.importers['tests/smoke-tests'].dependencies[ - '@sap-ai-sdk/ai-core' - ]; - delete lockfile.importers['tests/smoke-tests'].dependencies[ - '@sap-ai-sdk/gen-ai-hub' - ]; + Object.keys(lockfile.importers['tests/smoke-tests'].dependencies) + .filter(pkg => pkg.startsWith('@sap-ai-sdk')) + .forEach(pkg => { + delete lockfile.importers['tests/smoke-tests'].dependencies[pkg]; + }); return lockfile; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 676ff6f7..616ac683 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,7 +4,7 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -pnpmfileChecksum: npnjno6go7hyivfolifkve5zla +pnpmfileChecksum: sw22lycinhjjkgagqwcn4vevli importers: From 0f9b6cff45f5bbcabd0ec35f8d0a3b4238e9a16a Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Fri, 23 Aug 2024 15:53:24 +0200 Subject: [PATCH 22/32] fix docs --- tests/smoke-tests/README.md | 9 ++++++++- tests/smoke-tests/package.json | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index c38c66c1..80bc19c5 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -29,10 +29,17 @@ This copies the `dist` directory of the sample code app, logs in to SAP BTP and To run the tests, run: -``` +```bash pnpm test:smoke ``` ## Running the app locally +Download a service key for your AI Core service instance from SAP BTP. +Create a `.env.local` file in the sample-code directory and add the service key under`AICORE_SERVICE_KEY`. +Run: +```bash +pnpm smoke-tests create-deployment +pnpm smoke-tests local +``` diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index a4fb0f24..216909be 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -7,8 +7,8 @@ "private": "true", "scripts": { "start": "node dist/server.js", - "add-canary": "pnpm add @sap-ai-sdk/ai-core@canary --save-prod=false --save-dev=false && pnpm add @sap-ai-sdk/gen-ai-hub@canary --save-prod=false --save-dev=false", - "create-deployment": "pnpm add-canary && rm -rf dist && cp ../../sample-code/dist dist", + "local": "node --env-file=.env.local dist/server.js", + "create-deployment": "rm -rf dist && cp -r ../../sample-code/dist dist", "cf-login": "dotenv -- bash -c 'cf login -a \"$CF_API_URL\" -u \"$CF_USER\" -p \"$CF_PASSWORD\" -o \"$CF_ORG\" -s \"$CF_SPACE\"'", "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", From 504fe8691c5edd570cf2f08e22122f8514ea6874 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 26 Aug 2024 16:57:53 +0200 Subject: [PATCH 23/32] Add comment on local running --- tests/smoke-tests/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index 80bc19c5..275095f0 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -35,11 +35,14 @@ pnpm test:smoke ## Running the app locally -Download a service key for your AI Core service instance from SAP BTP. +This is currently not possible. +We will fix this soon. + + From a5a7224efbbd6961b3f30210867fd4c84f5a08fe Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Mon, 26 Aug 2024 17:08:17 +0200 Subject: [PATCH 24/32] do not adjust lockfile --- .pnpmfile.cjs | 20 ++++++++++---------- pnpm-lock.yaml | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs index cd7b267f..a0c2c849 100644 --- a/.pnpmfile.cjs +++ b/.pnpmfile.cjs @@ -1,17 +1,17 @@ module.exports = { hooks: { afterAllResolved: async lockfile => { - Object.keys(lockfile.packages) - .filter(pkg => pkg.startsWith('@sap-ai-sdk')) - .forEach(pkg => { - delete lockfile.packages[pkg]; - }); + // Object.keys(lockfile.packages) + // .filter(pkg => pkg.startsWith('@sap-ai-sdk')) + // .forEach(pkg => { + // delete lockfile.packages[pkg]; + // }); - Object.keys(lockfile.importers['tests/smoke-tests'].dependencies) - .filter(pkg => pkg.startsWith('@sap-ai-sdk')) - .forEach(pkg => { - delete lockfile.importers['tests/smoke-tests'].dependencies[pkg]; - }); + // Object.keys(lockfile.importers['tests/smoke-tests'].dependencies) + // .filter(pkg => pkg.startsWith('@sap-ai-sdk')) + // .forEach(pkg => { + // delete lockfile.importers['tests/smoke-tests'].dependencies[pkg]; + // }); return lockfile; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 829b8cbc..2415ef5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,7 +4,7 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -pnpmfileChecksum: sw22lycinhjjkgagqwcn4vevli +pnpmfileChecksum: fb3vh7gyjzvxzzal7fbygn3ogm importers: @@ -167,6 +167,12 @@ importers: tests/smoke-tests: dependencies: + '@sap-ai-sdk/ai-core': + specifier: canary + version: 0.0.1-20240826013038.0 + '@sap-ai-sdk/gen-ai-hub': + specifier: canary + version: 0.0.1-20240826013038.0 express: specifier: ^4.19.2 version: 4.19.2 @@ -673,6 +679,15 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@sap-ai-sdk/ai-core@0.0.1-20240826013038.0': + resolution: {integrity: sha512-3GMpB+kEYkba4MSduJwR4ahHLIAh9DqYIHAqNKFB1eZ4QjBMNX/XhffJfDPYMDkoczCScOrZ9t2VGGzuu8BXmw==} + + '@sap-ai-sdk/core@0.0.1-20240826013038.0': + resolution: {integrity: sha512-XEFbjaId45yaRM7Z/K1gxeDi/d+SpNw67cZTojtfyBvyLErbhU8e4ISdAsl6cYfmRvt+ArYf6KKT51HQvC8FWw==} + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240826013038.0': + resolution: {integrity: sha512-8Y0X7nVf/UZf/IqKYTRxQFkoixhqRGifsqfm7RSs1PU+es+aALTMlkNgCwZ5mHsf4XrgGV7Pf+IHTA1ssL530g==} + '@sap-cloud-sdk/connectivity@3.19.0': resolution: {integrity: sha512-fmA+oCv2MsoKVi9f2NiPzUCdBmCqxeytHNVHtBhy17qcuv52X4Vrz/ygYwB1j1EDJSl3OggxovV3F1ox223mhg==} @@ -4189,6 +4204,38 @@ snapshots: '@pkgr/core@0.1.1': {} + '@sap-ai-sdk/ai-core@0.0.1-20240826013038.0': + dependencies: + '@sap-ai-sdk/core': 0.0.1-20240826013038.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/core@0.0.1-20240826013038.0': + dependencies: + '@sap-cloud-sdk/connectivity': 3.19.0 + '@sap-cloud-sdk/http-client': 3.19.0 + '@sap-cloud-sdk/openapi': 3.19.0 + '@sap-cloud-sdk/util': 3.19.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + '@sap-ai-sdk/gen-ai-hub@0.0.1-20240826013038.0': + dependencies: + '@sap-ai-sdk/ai-core': 0.0.1-20240826013038.0 + '@sap-ai-sdk/core': 0.0.1-20240826013038.0 + '@sap-cloud-sdk/connectivity': 3.19.0 + '@sap-cloud-sdk/http-client': 3.19.0 + '@sap-cloud-sdk/openapi': 3.19.0 + '@sap-cloud-sdk/util': 3.19.0 + transitivePeerDependencies: + - debug + - encoding + - supports-color + '@sap-cloud-sdk/connectivity@3.19.0': dependencies: '@sap-cloud-sdk/resilience': 3.19.0 From b4af5c3c38489dc119e3f52a8d772dcf1ab020d2 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:37:51 +0200 Subject: [PATCH 25/32] Update tests/smoke-tests/README.md Co-authored-by: Tom Frenken <54979414+tomfrenken@users.noreply.github.com> --- tests/smoke-tests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index 275095f0..3cbff1f3 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -2,7 +2,7 @@ The purpose of the smoke tests is to find obvious issues in the e2e process of using the SAP Cloud SDK for AI libs. -The sample code app is running on Cloud Foundry and uses the current canary version of the SAP Cloud SDK for AI. +The sample application is running on Cloud Foundry and uses the current canary version of the SAP Cloud SDK for AI. ## Deploying a new version of the sample code app From 02cb0b421fd2968324bc463e7601c190769745e8 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:38:02 +0200 Subject: [PATCH 26/32] Update tests/smoke-tests/README.md Co-authored-by: Tom Frenken <54979414+tomfrenken@users.noreply.github.com> --- tests/smoke-tests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index 3cbff1f3..5b60a583 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -6,7 +6,7 @@ The sample application is running on Cloud Foundry and uses the current canary v ## Deploying a new version of the sample code app -The sample code app is deployed to SAP BTP nightly. +The sample application is deployed to SAP BTP nightly. To deploy a new version of the sample code app manually, make sure to provide your own `.env` file in the `test/smoke-tests` subdirectory with the following environment variables: - CF_API_URL From 210aa935ce4101610dd21f66a03afbe3e1434981 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:38:08 +0200 Subject: [PATCH 27/32] Update tests/smoke-tests/README.md Co-authored-by: Tom Frenken <54979414+tomfrenken@users.noreply.github.com> --- tests/smoke-tests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-tests/README.md b/tests/smoke-tests/README.md index 5b60a583..f37a48d3 100644 --- a/tests/smoke-tests/README.md +++ b/tests/smoke-tests/README.md @@ -7,7 +7,7 @@ The sample application is running on Cloud Foundry and uses the current canary v ## Deploying a new version of the sample code app The sample application is deployed to SAP BTP nightly. -To deploy a new version of the sample code app manually, make sure to provide your own `.env` file in the `test/smoke-tests` subdirectory with the following environment variables: +To deploy a new version of the sample application manually, make sure to provide your own `.env` file in the `test/smoke-tests` subdirectory with the following environment variables: - CF_API_URL - CF_USER From 133d2af0e18827ee5889adf1bc86ff157f7413fb Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 27 Aug 2024 09:44:04 +0200 Subject: [PATCH 28/32] add accidentally removed script --- .github/workflows/smoke-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index ad58dfc8..a3c57986 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -19,6 +19,7 @@ jobs: node-version: ${{ vars.DEFAULT_NODE_VERSION }} cache: 'pnpm' - run: pnpm i --frozen-lockfile + - run: pnpm smoke-tests create-deployment - uses: vchrisb/setup-cf@v0 with: api: ${{ vars.CF_API_URL }} From 1765ac2ef7b59fe8bf5829fea6510229d0490024 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski Date: Tue, 27 Aug 2024 10:22:39 +0200 Subject: [PATCH 29/32] fix tests --- sample-code/src/server.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sample-code/src/server.ts b/sample-code/src/server.ts index 71899960..793a3a4f 100644 --- a/sample-code/src/server.ts +++ b/sample-code/src/server.ts @@ -2,6 +2,7 @@ import express from 'express'; import { chatCompletion, computeEmbedding } from './aiservice.js'; import { orchestrationCompletion } from './orchestration.js'; +import { getDeployments } from './ai-core.js'; const app = express(); const port = 8080; @@ -49,7 +50,7 @@ app.get('/orchestration', async (req, res) => { app.get('/ai-core/get-deployments', async (req, res) => { try { - res.send(await chatCompletion()); + res.send(await getDeployments()); } catch (error: any) { console.error(error); res From f8f86d54df9317ec39e7423d2a7eccbc6685c935 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:32:59 +0200 Subject: [PATCH 30/32] Update tests/smoke-tests/package.json --- tests/smoke-tests/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index 216909be..abb6fc5e 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -23,5 +23,8 @@ "@types/express": "^4.17.21", "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2" + }, + "engines": { + "node": "^20" } } From d3c5ae4dd022e1e6b0391840f8cf5fda0e0da444 Mon Sep 17 00:00:00 2001 From: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:35:10 +0200 Subject: [PATCH 31/32] Apply suggestions from code review --- tests/smoke-tests/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index abb6fc5e..14280a88 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -13,7 +13,10 @@ "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" - }, + }, + "engines": { + "node": "^20" + }, "dependencies": { "@sap-ai-sdk/ai-core": "canary", "@sap-ai-sdk/gen-ai-hub": "canary", @@ -23,8 +26,5 @@ "@types/express": "^4.17.21", "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2" - }, - "engines": { - "node": "^20" } } From 4b426d65757e5593536e9a5cc38eb48ba921f7f7 Mon Sep 17 00:00:00 2001 From: cloud-sdk-js Date: Tue, 27 Aug 2024 08:35:49 +0000 Subject: [PATCH 32/32] fix: Changes from lint --- tests/smoke-tests/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index 14280a88..29ad4481 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -13,10 +13,10 @@ "test": "NODE_OPTIONS=--experimental-vm-modules jest", "lint": "eslint . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" - }, + }, "engines": { "node": "^20" - }, + }, "dependencies": { "@sap-ai-sdk/ai-core": "canary", "@sap-ai-sdk/gen-ai-hub": "canary",