From 35db8efa60d23c44a534663cab2d32cc50a4553d Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Fri, 27 Sep 2024 16:05:05 +0200 Subject: [PATCH 01/30] feat: add cap app with openai chat completion --- pnpm-lock.yaml | 612 ++++++++++++++++++ pnpm-workspace.yaml | 10 +- sample-cap/.gitignore | 34 + sample-cap/README.md | 25 + .../azure-openai/chat-completions-entity.cds | 10 + sample-cap/eslint.config.mjs | 2 + sample-cap/jsconfig.json | 10 + sample-cap/package.json | 26 + .../azure-openai/chat-completion-service.cds | 5 + .../azure-openai/chat-completion-service.ts | 11 + sample-cap/srv/index.cds | 1 + 11 files changed, 741 insertions(+), 5 deletions(-) create mode 100644 sample-cap/.gitignore create mode 100644 sample-cap/README.md create mode 100644 sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds create mode 100644 sample-cap/eslint.config.mjs create mode 100644 sample-cap/jsconfig.json create mode 100644 sample-cap/package.json create mode 100644 sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds create mode 100644 sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts create mode 100644 sample-cap/srv/index.cds diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 255e78eb..93e16c8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,31 @@ importers: specifier: ^3.21.0 version: 3.21.0 + sample-cap: + dependencies: + '@sap-ai-sdk/foundation-models': + specifier: workspace:^ + version: link:../packages/foundation-models + '@sap/cds': + specifier: ^8 + version: 8.2.3(express@4.21.0) + express: + specifier: ^4 + version: 4.21.0 + devDependencies: + '@cap-js/cds-typer': + specifier: '>=0.1' + version: 0.26.0(@cap-js/cds-types@0.6.5(@sap/cds@8.2.3(express@4.21.0)))(@sap/cds@8.2.3(express@4.21.0)) + '@cap-js/cds-types': + specifier: ^0.6 + version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) + '@cap-js/sqlite': + specifier: ^1 + version: 1.7.3(@sap/cds@8.2.3(express@4.21.0)) + tsx: + specifier: ^4.19.1 + version: 4.19.1 + sample-code: dependencies: '@langchain/core': @@ -472,6 +497,28 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@cap-js/cds-typer@0.26.0': + resolution: {integrity: sha512-FLSZ1DJ5kxVQq/KTkN2tT4mPAmTw7Z3uvnWutDu/hdmSTssT/Mj0IlsFNJDY1pb/TqDWRwI2FdxQOsFkbR2Ipw==} + hasBin: true + peerDependencies: + '@cap-js/cds-types': '>=0.6.4' + '@sap/cds': '>=8' + + '@cap-js/cds-types@0.6.5': + resolution: {integrity: sha512-lcsc0Bp9aINW2cQIqaadGZ1lSWqCmk9lagoyoHfQimddbSngexevoBm7RDOL9s/L4RMKGO+kBumcPq5sBBU9SA==} + peerDependencies: + '@sap/cds': ^8.0.0 + + '@cap-js/db-service@1.12.1': + resolution: {integrity: sha512-0sIyXK/osLIywIVdGj8CSVjSqGh1tjqImU9NPeAIfUxAtx7lBbuhwZdNpolxw6YfmCyWeIogJEzh0Nb3LWF8tQ==} + peerDependencies: + '@sap/cds': '>=7.9' + + '@cap-js/sqlite@1.7.3': + resolution: {integrity: sha512-pNVOICqTuMHndeLtXrGopH/85Fe0lNHjWXHmiQGiQTD4nlwbMruNBRbclXuDi+SgpFWTLcpLpGrnaLDdX+mMOg==} + peerDependencies: + '@sap/cds': '>=7.6' + '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -542,6 +589,150 @@ packages: resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -831,6 +1022,31 @@ packages: '@sap-cloud-sdk/util@3.21.0': resolution: {integrity: sha512-iOMDly7hLoOusOy7DRPpWOiOcE06G9QigWTk0Hbfm13tkKi3cq/wUhdtK0wcDhu4oe8jqCEImDrcDwS0ZiJrDg==} + '@sap/cds-compiler@5.2.0': + resolution: {integrity: sha512-ymp1ChXMbU5D6P6O7QOaM8J5DUVNjtm6hr8EXoQsywtwwKuMp5UfM5n6+ube1MmInU3L9nI57l/3G3MacK+6Qg==} + engines: {node: '>=18'} + hasBin: true + + '@sap/cds-fiori@1.2.7': + resolution: {integrity: sha512-F6Uf9wvkv0fXW+Fh7PiV2BbB/k+p1cFJLkQCCKDRJH8HvlxWEcXcn/YIvBrQGuX+GToi125MxB3wd712d8OLTA==} + peerDependencies: + '@sap/cds': '>=7.6' + express: '>=4' + + '@sap/cds-foss@5.0.1': + resolution: {integrity: sha512-q6h7LkEx6w9LswCIQzJJ2mnoyeGS8jrmBXN4I4+aECRL60mkLskoqGetot+2tX2xXGxCYJuo5v1dtSafwBqTRQ==} + engines: {node: '>=14'} + + '@sap/cds@8.2.3': + resolution: {integrity: sha512-VZde7OvqMx2ehjwSIXfAqO20ROcn0G2H4ZBQA3FakQcFGz/7ay7fUsX+R/FWfQvDbwFUPqySHAWqoPPqkYJY+A==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + express: '>=4' + peerDependenciesMeta: + express: + optional: true + '@sap/xsenv@5.2.0': resolution: {integrity: sha512-okXo4LMIO/n3IqGWcOHVQd2J4o5oirynBfhm07wf5nkQYL0YE4oYOrhgkH2uZPd6hMNfjr0lAT0VS/tgO9lW6g==} engines: {node: ^18.0.0 || ^20.0.0} @@ -903,9 +1119,15 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + '@types/express-serve-static-core@5.0.0': resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==} + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} @@ -1162,6 +1384,10 @@ packages: resolution: {integrity: sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==} engines: {node: '>=15'} + antlr4@4.9.3: + resolution: {integrity: sha512-qNy2odgsa0skmNMCuxzXhM4M8J1YDaPv3TI+vCdnOAanu0N982wBrSqziDKRDctEZLZy9VffqIZXc0UGjjSP/g==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1281,10 +1507,19 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + better-sqlite3@11.3.0: + resolution: {integrity: sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w==} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1389,6 +1624,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1580,6 +1818,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -1588,6 +1830,10 @@ packages: babel-plugin-macros: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1634,6 +1880,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1724,6 +1974,9 @@ packages: encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1768,6 +2021,11 @@ packages: es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -1942,6 +2200,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -2012,6 +2274,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -2080,6 +2345,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2110,6 +2378,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2134,6 +2406,12 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2942,6 +3220,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2976,6 +3258,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mock-fs@5.3.0: resolution: {integrity: sha512-IMvz1X+RF7vf+ur7qUenXMR7/FSKSIqS3HqFHXcyNI7G0FbpFO8L5lfsUJhl+bhK1AiulVHWKUSxebWauPA+xQ==} engines: {node: '>=12.0.0'} @@ -3009,6 +3294,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3020,6 +3308,10 @@ packages: resolution: {integrity: sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==} engines: {node: '>= 10.13'} + node-abi@3.68.0: + resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} + engines: {node: '>=10'} + node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} @@ -3303,6 +3595,11 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3348,6 +3645,9 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3374,6 +3674,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -3438,6 +3742,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -3566,6 +3873,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3669,6 +3982,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3701,6 +4018,13 @@ packages: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -3822,6 +4146,14 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4029,6 +4361,10 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4322,6 +4658,27 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@cap-js/cds-typer@0.26.0(@cap-js/cds-types@0.6.5(@sap/cds@8.2.3(express@4.21.0)))(@sap/cds@8.2.3(express@4.21.0))': + dependencies: + '@cap-js/cds-types': 0.6.5(@sap/cds@8.2.3(express@4.21.0)) + '@sap/cds': 8.2.3(express@4.21.0) + + '@cap-js/cds-types@0.6.5(@sap/cds@8.2.3(express@4.21.0))': + dependencies: + '@sap/cds': 8.2.3(express@4.21.0) + '@types/express': 4.17.21 + + '@cap-js/db-service@1.12.1(@sap/cds@8.2.3(express@4.21.0))': + dependencies: + '@sap/cds': 8.2.3(express@4.21.0) + generic-pool: 3.9.0 + + '@cap-js/sqlite@1.7.3(@sap/cds@8.2.3(express@4.21.0))': + dependencies: + '@cap-js/db-service': 1.12.1(@sap/cds@8.2.3(express@4.21.0)) + '@sap/cds': 8.2.3(express@4.21.0) + better-sqlite3: 11.3.0 + '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -4484,6 +4841,78 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1)': dependencies: eslint: 9.11.1 @@ -5077,6 +5506,30 @@ snapshots: transitivePeerDependencies: - debug + '@sap/cds-compiler@5.2.0': + dependencies: + antlr4: 4.9.3 + + '@sap/cds-fiori@1.2.7(@sap/cds@8.2.3(express@4.21.0))(express@4.21.0)': + dependencies: + '@sap/cds': 8.2.3(express@4.21.0) + express: 4.21.0 + + '@sap/cds-foss@5.0.1': + dependencies: + big.js: 6.2.2 + generic-pool: 3.9.0 + xmlbuilder: 15.1.1 + yaml: 2.5.1 + + '@sap/cds@8.2.3(express@4.21.0)': + dependencies: + '@sap/cds-compiler': 5.2.0 + '@sap/cds-fiori': 1.2.7(@sap/cds@8.2.3(express@4.21.0))(express@4.21.0) + '@sap/cds-foss': 5.0.1 + optionalDependencies: + express: 4.21.0 + '@sap/xsenv@5.2.0': dependencies: debug: 4.3.5 @@ -5167,6 +5620,13 @@ snapshots: '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 20.16.9 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + '@types/express-serve-static-core@5.0.0': dependencies: '@types/node': 20.16.9 @@ -5174,6 +5634,13 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 0.17.4 + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + '@types/express@5.0.0': dependencies: '@types/body-parser': 1.19.5 @@ -5463,6 +5930,8 @@ snapshots: ansis@3.3.2: {} + antlr4@4.9.3: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -5627,8 +6096,19 @@ snapshots: dependencies: is-windows: 1.0.2 + better-sqlite3@11.3.0: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.2 + + big.js@6.2.2: {} + binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -5774,6 +6254,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + ci-info@3.9.0: {} ci-info@4.0.0: {} @@ -5944,8 +6426,14 @@ snapshots: decamelize@1.2.0: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@1.5.3: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -6006,6 +6494,8 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@2.0.3: {} + detect-newline@3.1.0: {} diff-sequences@29.6.3: {} @@ -6087,6 +6577,10 @@ snapshots: whatwg-encoding: 3.1.1 optional: true + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -6177,6 +6671,33 @@ snapshots: es6-promise@3.3.1: {} + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.1.2: {} escape-html@1.0.3: {} @@ -6383,6 +6904,8 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: {} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 @@ -6492,6 +7015,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-uri-to-path@1.0.0: {} + filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -6566,6 +7091,8 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -6600,6 +7127,8 @@ snapshots: functions-have-names@1.2.3: {} + generic-pool@3.9.0: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -6622,6 +7151,12 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -7642,6 +8177,8 @@ snapshots: mimic-fn@2.1.0: {} + mimic-response@3.1.0: {} + min-indent@1.0.1: {} minimatch@10.0.1: @@ -7674,6 +8211,8 @@ snapshots: minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} + mock-fs@5.3.0: {} mri@1.2.0: {} @@ -7698,6 +8237,8 @@ snapshots: nanoid@3.3.7: {} + napi-build-utils@1.0.2: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -7710,6 +8251,10 @@ snapshots: transitivePeerDependencies: - supports-color + node-abi@3.68.0: + dependencies: + semver: 7.6.3 + node-cache@5.1.2: dependencies: clone: 2.1.2 @@ -8013,6 +8558,21 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.68.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -8048,6 +8608,11 @@ snapshots: pseudomap@1.0.2: {} + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -8069,6 +8634,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react-is@18.3.1: {} read-pkg-up@7.0.1: @@ -8136,6 +8708,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.2: {} resolve@1.22.8: @@ -8284,6 +8858,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -8393,6 +8975,8 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} supports-color@5.5.0: @@ -8435,6 +9019,21 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.7.0 + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + term-size@2.2.1: {} test-exclude@6.0.0: @@ -8572,6 +9171,17 @@ snapshots: tslib: 1.14.1 typescript: 5.6.2 + tsx@4.19.1: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -8802,6 +9412,8 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + xmlbuilder@15.1.1: {} + y18n@5.0.8: {} yallist@2.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 668306b5..6e69fa57 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,12 +1,12 @@ packages: - # all packages in direct subdirs of packages/ - 'packages/ai-api' - - 'packages/foundation-models' - - 'packages/orchestration' - 'packages/core' + - 'packages/foundation-models' - 'packages/langchain' + - 'packages/orchestration' + - 'sample-cap' - 'sample-code' - 'tests/e2e-tests' - - 'tests/type-tests' - - 'tests/smoke-tests' - 'tests/schema-tests' + - 'tests/smoke-tests' + - 'tests/type-tests' diff --git a/sample-cap/.gitignore b/sample-cap/.gitignore new file mode 100644 index 00000000..eb696050 --- /dev/null +++ b/sample-cap/.gitignore @@ -0,0 +1,34 @@ +# CAP bookshop +_out +*.db +*.sqlite +connection.properties +default-*.json +.cdsrc-private.json +gen/ +node_modules/ +target/ + +# Web IDE, App Studio +.che/ +.gen/ + +# MTA +*_mta_build_tmp +*.mtar +mta_archives/ + +# Other +.DS_Store +*.orig +*.log + +*.iml +*.flattened-pom.xml + +# IDEs +# .vscode +# .idea + +# @cap-js/cds-typer +@cds-models diff --git a/sample-cap/README.md b/sample-cap/README.md new file mode 100644 index 00000000..dbac29eb --- /dev/null +++ b/sample-cap/README.md @@ -0,0 +1,25 @@ +# Getting Started + +Welcome to your new project. + +It contains these folders and files, following our recommended project layout: + +File or Folder | Purpose +---------|---------- +`app/` | content for UI frontends goes here +`db/` | your domain models and data go here +`srv/` | your service models and code go here +`package.json` | project metadata and configuration +`readme.md` | this getting started guide + + +## Next Steps + +- Open a new terminal and run `cds watch` +- (in VS Code simply choose _**Terminal** > Run Task > cds watch_) +- Start adding content, for example, a [db/schema.cds](db/schema.cds). + + +## Learn More + +Learn more at https://cap.cloud.sap/docs/get-started/. diff --git a/sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds b/sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds new file mode 100644 index 00000000..a6a50711 --- /dev/null +++ b/sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds @@ -0,0 +1,10 @@ +using { cuid } from '@sap/cds/common'; + +entity ChatCompletionsEntity: cuid { + messages: many Message; +} + +type Message { + role: String; + content: String; +} diff --git a/sample-cap/eslint.config.mjs b/sample-cap/eslint.config.mjs new file mode 100644 index 00000000..2fdb4320 --- /dev/null +++ b/sample-cap/eslint.config.mjs @@ -0,0 +1,2 @@ +import cds from '@sap/cds/eslint.config.mjs' +export default [ ...cds.recommended ] diff --git a/sample-cap/jsconfig.json b/sample-cap/jsconfig.json new file mode 100644 index 00000000..9cad509e --- /dev/null +++ b/sample-cap/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "moduleResolution": "nodenext", + "paths": { + "#cds-models/*": [ + "./@cds-models/*" + ] + } + } +} diff --git a/sample-cap/package.json b/sample-cap/package.json new file mode 100644 index 00000000..fd3b5b2f --- /dev/null +++ b/sample-cap/package.json @@ -0,0 +1,26 @@ +{ + "type": "module", + "name": "@sap-ai-sdk/sample-cap", + "version": "1.0.0", + "description": "Sample CAP application with Cloud SDK for AI.", + "repository": "https://github.com/sap/ai-sdk-js", + "license": "UNLICENSED", + "private": true, + "dependencies": { + "@sap/cds": "^8", + "express": "^4", + "@sap-ai-sdk/foundation-models": "workspace:^" + }, + "devDependencies": { + "@cap-js/sqlite": "^1", + "@cap-js/cds-types": "^0.6", + "@cap-js/cds-typer": ">=0.1", + "tsx": "^4.19.1" + }, + "scripts": { + "start": "cds-tsx serve" + }, + "imports": { + "#cds-models/*": "./@cds-models/*/index.js" + } +} diff --git a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds new file mode 100644 index 00000000..5db0048a --- /dev/null +++ b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds @@ -0,0 +1,5 @@ +using { ChatCompletionsEntity } from '../../../db/foundation-models/azure-openai/chat-completions-entity'; + +service ChatCompletionsService { + entity ChatCompletions as projection on ChatCompletionsEntity; +} diff --git a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts new file mode 100644 index 00000000..b5b4df29 --- /dev/null +++ b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts @@ -0,0 +1,11 @@ +import { ChatCompletionsService, ChatCompletions } from '#cds-models/ChatCompletionsService'; +import { AzureOpenAiChatClient, AzureOpenAiCreateChatCompletionRequest } from '@sap-ai-sdk/foundation-models'; + +export = (srv: ChatCompletionsService) => { + srv.on('CREATE', ChatCompletions.name, async req => { + const { ID: _, ...chatCompletion } = req.data as AzureOpenAiCreateChatCompletionRequest; + console.log(JSON.stringify(chatCompletion)); + const response = await new AzureOpenAiChatClient('gpt-35-turbo').run(chatCompletion); + return req.info(response.getContent()); + }); +}; \ No newline at end of file diff --git a/sample-cap/srv/index.cds b/sample-cap/srv/index.cds new file mode 100644 index 00000000..4a9c055c --- /dev/null +++ b/sample-cap/srv/index.cds @@ -0,0 +1 @@ +using from './foundation-models/azure-openai/chat-completion-service'; \ No newline at end of file From c8003acb7cda38594b2a602153eb6711faaff819 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Fri, 27 Sep 2024 16:19:00 +0200 Subject: [PATCH 02/30] docs: add README --- sample-cap/README.md | 44 ++++++++++++++++++++++++++--------------- sample-cap/package.json | 3 ++- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index dbac29eb..94183cdc 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -1,25 +1,37 @@ -# Getting Started +# Sample CAP Application with SAP Cloud SDK for AI -Welcome to your new project. +Sample CAP application written in TypeScript to demonstrate the usage of SAP Cloud SDK for AI. -It contains these folders and files, following our recommended project layout: +## Build and Run Locally -File or Folder | Purpose ----------|---------- -`app/` | content for UI frontends goes here -`db/` | your domain models and data go here -`srv/` | your service models and code go here -`package.json` | project metadata and configuration -`readme.md` | this getting started guide +1. Build the application with `pnpm install`. +2. Bind the application to your AI Core instance: -## Next Steps + ```bash + cds bind -2 AI_CORE_INSTANCE_NAME + ``` -- Open a new terminal and run `cds watch` -- (in VS Code simply choose _**Terminal** > Run Task > cds watch_) -- Start adding content, for example, a [db/schema.cds](db/schema.cds). +3. Run the application: + ```bash + cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start + ``` -## Learn More +### Usage -Learn more at https://cap.cloud.sap/docs/get-started/. +#### Azure OpenAI Chat Completion + +```bash +curl --request POST \ + --url 'http://localhost:4004/odata/v4/chat-completions/ChatCompletions' \ + --header 'Content-Type: application/json' \ + --data '{ + "messages": [ + { + "role": "user", + "content": "Hello, how are you?" + } + ] +}' +``` diff --git a/sample-cap/package.json b/sample-cap/package.json index fd3b5b2f..37075a50 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -18,7 +18,8 @@ "tsx": "^4.19.1" }, "scripts": { - "start": "cds-tsx serve" + "start": "cds-tsx serve", + "watch": "cds-tsx watch" }, "imports": { "#cds-models/*": "./@cds-models/*/index.js" From 9e50c7da033f2571914a854ebd42009b6b248833 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Fri, 27 Sep 2024 16:37:31 +0200 Subject: [PATCH 03/30] refactor: entity and service name --- sample-cap/README.md | 2 +- ....cds => azure-openai-chat-completions-entity.cds} | 2 +- .../srv/foundation-models/azure-openai-service.cds | 6 ++++++ .../srv/foundation-models/azure-openai-service.ts | 12 ++++++++++++ .../azure-openai/chat-completion-service.cds | 5 ----- .../azure-openai/chat-completion-service.ts | 11 ----------- sample-cap/srv/index.cds | 2 +- 7 files changed, 21 insertions(+), 19 deletions(-) rename sample-cap/db/foundation-models/{azure-openai/chat-completions-entity.cds => azure-openai-chat-completions-entity.cds} (71%) create mode 100644 sample-cap/srv/foundation-models/azure-openai-service.cds create mode 100644 sample-cap/srv/foundation-models/azure-openai-service.ts delete mode 100644 sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds delete mode 100644 sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts diff --git a/sample-cap/README.md b/sample-cap/README.md index 94183cdc..43d3df10 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -24,7 +24,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ```bash curl --request POST \ - --url 'http://localhost:4004/odata/v4/chat-completions/ChatCompletions' \ + --url 'http://localhost:4004/odata/v4/azure-openai/ChatCompletions' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ diff --git a/sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds similarity index 71% rename from sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds rename to sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds index a6a50711..046b7fe8 100644 --- a/sample-cap/db/foundation-models/azure-openai/chat-completions-entity.cds +++ b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds @@ -1,6 +1,6 @@ using { cuid } from '@sap/cds/common'; -entity ChatCompletionsEntity: cuid { +entity AzureOpenAiChatCompletionsEntity: cuid { messages: many Message; } diff --git a/sample-cap/srv/foundation-models/azure-openai-service.cds b/sample-cap/srv/foundation-models/azure-openai-service.cds new file mode 100644 index 00000000..6831fba3 --- /dev/null +++ b/sample-cap/srv/foundation-models/azure-openai-service.cds @@ -0,0 +1,6 @@ +using { AzureOpenAiChatCompletionsEntity } from '../../db/foundation-models/azure-openai-chat-completions-entity'; + +@path: 'azure-openai' +service AzureOpenAiService { + entity ChatCompletions as projection on AzureOpenAiChatCompletionsEntity; +} diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts new file mode 100644 index 00000000..f2892557 --- /dev/null +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -0,0 +1,12 @@ +import { AzureOpenAiService, ChatCompletions } from '#cds-models/AzureOpenAiService'; +import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; + +export = (srv: AzureOpenAiService) => { + srv.on('CREATE', ChatCompletions.name, async req => { + const { ID: _, ...chatCompletion } = req.data; + console.log(JSON.stringify(chatCompletion)); + + const response = await new AzureOpenAiChatClient('gpt-35-turbo').run(chatCompletion); + return req.info(response.getContent()); + }); +}; \ No newline at end of file diff --git a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds deleted file mode 100644 index 5db0048a..00000000 --- a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.cds +++ /dev/null @@ -1,5 +0,0 @@ -using { ChatCompletionsEntity } from '../../../db/foundation-models/azure-openai/chat-completions-entity'; - -service ChatCompletionsService { - entity ChatCompletions as projection on ChatCompletionsEntity; -} diff --git a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts b/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts deleted file mode 100644 index b5b4df29..00000000 --- a/sample-cap/srv/foundation-models/azure-openai/chat-completion-service.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ChatCompletionsService, ChatCompletions } from '#cds-models/ChatCompletionsService'; -import { AzureOpenAiChatClient, AzureOpenAiCreateChatCompletionRequest } from '@sap-ai-sdk/foundation-models'; - -export = (srv: ChatCompletionsService) => { - srv.on('CREATE', ChatCompletions.name, async req => { - const { ID: _, ...chatCompletion } = req.data as AzureOpenAiCreateChatCompletionRequest; - console.log(JSON.stringify(chatCompletion)); - const response = await new AzureOpenAiChatClient('gpt-35-turbo').run(chatCompletion); - return req.info(response.getContent()); - }); -}; \ No newline at end of file diff --git a/sample-cap/srv/index.cds b/sample-cap/srv/index.cds index 4a9c055c..9f6f1bb5 100644 --- a/sample-cap/srv/index.cds +++ b/sample-cap/srv/index.cds @@ -1 +1 @@ -using from './foundation-models/azure-openai/chat-completion-service'; \ No newline at end of file +using from './foundation-models/azure-openai-service'; From 5f09d1a50763281f767e197e369f443d0a2c9f89 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 30 Sep 2024 15:20:03 +0200 Subject: [PATCH 04/30] feat: add ai-api and orchestration --- pnpm-lock.yaml | 64 +++++++++---------- sample-cap/README.md | 38 ++++++++++- .../db/ai-api/ai-deployments-entity.cds | 15 +++++ .../azure-openai-chat-completions-entity.cds | 10 +-- .../orchestration-chat-completions-entity.cds | 16 +++++ sample-cap/srv/ai-api/ai-api-service.cds | 6 ++ sample-cap/srv/ai-api/ai-api-service.ts | 12 ++++ .../foundation-models/azure-openai-service.ts | 2 - sample-cap/srv/index.cds | 2 + .../orchestration/orchestration-service.cds | 6 ++ .../orchestration/orchestration-service.ts | 25 ++++++++ 11 files changed, 156 insertions(+), 40 deletions(-) create mode 100644 sample-cap/db/ai-api/ai-deployments-entity.cds create mode 100644 sample-cap/db/orchestration/orchestration-chat-completions-entity.cds create mode 100644 sample-cap/srv/ai-api/ai-api-service.cds create mode 100644 sample-cap/srv/ai-api/ai-api-service.ts create mode 100644 sample-cap/srv/orchestration/orchestration-service.cds create mode 100644 sample-cap/srv/orchestration/orchestration-service.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93e16c8b..b106f557 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -260,16 +260,16 @@ importers: version: 0.3.5(openai@4.61.1(zod@3.23.8)) '@sap-ai-sdk/ai-api': specifier: canary - version: 1.0.1-20241001013134.0 + version: 1.0.1-20240929013103.0 '@sap-ai-sdk/foundation-models': specifier: canary - version: 1.0.1-20241001013134.0 + version: 1.0.1-20240929013103.0 '@sap-ai-sdk/langchain': specifier: canary - version: 1.0.1-20241001013134.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8) + version: 1.0.1-20240929013103.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8) '@sap-ai-sdk/orchestration': specifier: canary - version: 1.0.1-20241001013134.0 + version: 1.0.1-20240929013103.0 express: specifier: ^4.21.0 version: 4.21.0 @@ -927,8 +927,8 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@langchain/core@0.3.4': - resolution: {integrity: sha512-ULxB0rTCW5+Ej3uO8gg1tep06Nm2rO7KVMwNFF7cVz4OPIEN2eQa25rMTFeja22YINn01msxB1A25y8skMa6TA==} + '@langchain/core@0.3.3': + resolution: {integrity: sha512-WAtkmhbdl2T41qzimTzhb3pXCHQxO4onqxzPxgdf3KftQdTwLq0YYBDhozRMZLNAd/+cfH0ymZGaZSsnc9Ogsg==} engines: {node: '>=18'} '@langchain/core@0.3.5': @@ -980,20 +980,20 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sap-ai-sdk/ai-api@1.0.1-20241001013134.0': - resolution: {integrity: sha512-8m42FMFuvFP3yNkkpDcdQuk3ccx7D7M2hyduDIlwQ7Z8LnOZSHvuHztsx4LbxNe51YJbCCCPZjudGMoX+TvWcw==} + '@sap-ai-sdk/ai-api@1.0.1-20240929013103.0': + resolution: {integrity: sha512-Dc7Q5on38UJxgYApT2b9DhmkYGTY7I8WqxpBXfvp1P4LFSLo+c2T3uRHSeNcd01dl0ymIhC+ecl9z1ltQ+kA5g==} - '@sap-ai-sdk/core@1.0.1-20241001013134.0': - resolution: {integrity: sha512-rNdKn3L+xSplpsHPPGTqhDw5N9zVs7/x4wDO0kQm10i2k6YihTtPrc53ueMpsHpRCoEcbI/EOddOnVkbWBP4wg==} + '@sap-ai-sdk/core@1.0.1-20240929013103.0': + resolution: {integrity: sha512-SlsqM+wIwr6Ou2HwlzBIXcB1VBj1ChOfxz9ZlyqTyWeMsg5NHfusrdm4UPAEishIqFZp/QHAtbn6jrJ7103pFw==} - '@sap-ai-sdk/foundation-models@1.0.1-20241001013134.0': - resolution: {integrity: sha512-en7jBOrdQa9DFBr4rMbccgb+yuQP0F5VGNX2vVy9BYSr8UDLXrmeNgxfvkb1u21w/fZ59GNVTabLeE/76TX8uA==} + '@sap-ai-sdk/foundation-models@1.0.1-20240929013103.0': + resolution: {integrity: sha512-g3ERKH6W2I6YIDChoaXFZrFlYkDRI/pYOWJvlP7/G5TT3/cuIyHwZDY+K+ajsOqY32tAfWRWISuLko1sqsU4xw==} - '@sap-ai-sdk/langchain@1.0.1-20241001013134.0': - resolution: {integrity: sha512-22hFzIjKwG6AaULnb04TK39Bm6tQO5CINBNvcOMV/EpZ+WrWLeCC3NZ6YrAw4NXcD1iBad5VNNGzaf4SAzWw/g==} + '@sap-ai-sdk/langchain@1.0.1-20240929013103.0': + resolution: {integrity: sha512-xrTNcMWmW0qF4abKs73e44cLjGsY8US0KCIKqtYgEvhVnU28IIlVg0BkS4oEXe/gCCeH00tdbvz9tHf48k10kA==} - '@sap-ai-sdk/orchestration@1.0.1-20241001013134.0': - resolution: {integrity: sha512-xAHR0zBdT+K2ZzC9sLVm9dV/WiekHryJFFSP5A30prk6uvq93ilMviDGRxDA0Wz0XhaGowQL7p+fsLOfpiPyRA==} + '@sap-ai-sdk/orchestration@1.0.1-20240929013103.0': + resolution: {integrity: sha512-n10yK77PlvwXmQiNXnRlM0tKXbbtFST6l0MeKI3JRx1fh7nLI2HcDUYdNuynpyyVVZg+JAL+7vUvGMOGpumOGA==} '@sap-cloud-sdk/connectivity@3.21.0': resolution: {integrity: sha512-E3WdZ13r+va/DYaj/vLLUEmtj9bKtkxcUiqMWG560X7vFzcUDN0jKtSE8L+RkWs7k3bqsIr01EV+TuGku9mggQ==} @@ -5251,7 +5251,7 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@langchain/core@0.3.4(openai@4.61.1(zod@3.23.8))': + '@langchain/core@0.3.3(openai@4.61.1(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 @@ -5353,15 +5353,15 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sap-ai-sdk/ai-api@1.0.1-20241001013134.0': + '@sap-ai-sdk/ai-api@1.0.1-20240929013103.0': dependencies: - '@sap-ai-sdk/core': 1.0.1-20241001013134.0 + '@sap-ai-sdk/core': 1.0.1-20240929013103.0 '@sap-cloud-sdk/connectivity': 3.21.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/core@1.0.1-20241001013134.0': + '@sap-ai-sdk/core@1.0.1-20240929013103.0': dependencies: '@sap-cloud-sdk/connectivity': 3.21.0 '@sap-cloud-sdk/http-client': 3.21.0 @@ -5371,22 +5371,22 @@ snapshots: - debug - supports-color - '@sap-ai-sdk/foundation-models@1.0.1-20241001013134.0': + '@sap-ai-sdk/foundation-models@1.0.1-20240929013103.0': dependencies: - '@sap-ai-sdk/ai-api': 1.0.1-20241001013134.0 - '@sap-ai-sdk/core': 1.0.1-20241001013134.0 + '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 + '@sap-ai-sdk/core': 1.0.1-20240929013103.0 '@sap-cloud-sdk/http-client': 3.21.0 '@sap-cloud-sdk/util': 3.21.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/langchain@1.0.1-20241001013134.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8)': + '@sap-ai-sdk/langchain@1.0.1-20240929013103.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8)': dependencies: - '@langchain/core': 0.3.4(openai@4.61.1(zod@3.23.8)) - '@sap-ai-sdk/ai-api': 1.0.1-20241001013134.0 - '@sap-ai-sdk/core': 1.0.1-20241001013134.0 - '@sap-ai-sdk/foundation-models': 1.0.1-20241001013134.0 + '@langchain/core': 0.3.3(openai@4.61.1(zod@3.23.8)) + '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 + '@sap-ai-sdk/core': 1.0.1-20240929013103.0 + '@sap-ai-sdk/foundation-models': 1.0.1-20240929013103.0 zod-to-json-schema: 3.23.3(zod@3.23.8) transitivePeerDependencies: - debug @@ -5394,10 +5394,10 @@ snapshots: - supports-color - zod - '@sap-ai-sdk/orchestration@1.0.1-20241001013134.0': + '@sap-ai-sdk/orchestration@1.0.1-20240929013103.0': dependencies: - '@sap-ai-sdk/ai-api': 1.0.1-20241001013134.0 - '@sap-ai-sdk/core': 1.0.1-20241001013134.0 + '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 + '@sap-ai-sdk/core': 1.0.1-20240929013103.0 '@sap-cloud-sdk/http-client': 3.21.0 '@sap-cloud-sdk/util': 3.21.0 transitivePeerDependencies: @@ -5622,7 +5622,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.16.9 + '@types/node': 20.16.10 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 diff --git a/sample-cap/README.md b/sample-cap/README.md index 43d3df10..50f4f310 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -20,7 +20,19 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ### Usage -#### Azure OpenAI Chat Completion +#### ai-api + +##### Deployment API + +```bash +curl --request GET \ + --url 'http://localhost:4004/odata/v4/ai-api/Deployments' \ + --header 'Content-Type: application/json' +``` + +#### foundation-models + +##### Azure OpenAI Chat Completion ```bash curl --request POST \ @@ -35,3 +47,27 @@ curl --request POST \ ] }' ``` + +#### orchestration + +##### + +```bash +curl --request POST \ + --url 'http://localhost:4004/odata/v4/orchestration/ChatCompletions' \ + --header 'Content-Type: application/json' \ + --data '{ + "template": [ + { + "role": "user", + "content": "What is the capital of {{?country}}" + } + ], + "inputParams": [ + { + "name": "country", + "value": "France" + } + ] +}' +``` diff --git a/sample-cap/db/ai-api/ai-deployments-entity.cds b/sample-cap/db/ai-api/ai-deployments-entity.cds new file mode 100644 index 00000000..192d2550 --- /dev/null +++ b/sample-cap/db/ai-api/ai-deployments-entity.cds @@ -0,0 +1,15 @@ +entity AiDeploymentsEntity { + key id : String @assert.format: '[\\w.-]{4,64}'; + deploymentUrl : String; + status : AiDeploymentStatus; +} + +type AiDeploymentStatus : String enum { + PENDING; + RUNNING; + COMPLETED; + DEAD; + STOPPING; + STOPPED; + UNKNOWN; +} diff --git a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds index 046b7fe8..3a81e517 100644 --- a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds +++ b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds @@ -1,10 +1,10 @@ -using { cuid } from '@sap/cds/common'; +using {cuid} from '@sap/cds/common'; -entity AzureOpenAiChatCompletionsEntity: cuid { - messages: many Message; +entity AzureOpenAiChatCompletionsEntity : cuid { + messages : many Message; } type Message { - role: String; - content: String; + role : String; + content : String; } diff --git a/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds b/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds new file mode 100644 index 00000000..4c247067 --- /dev/null +++ b/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds @@ -0,0 +1,16 @@ +using {cuid} from '@sap/cds/common'; + +entity OrchestrationChatCompletionsEntity : cuid { + template : many Template; + inputParams : many InputParam; +} + +type Template { + role : String; + content : String; +} + +type InputParam { + name : String; + value : String; +} diff --git a/sample-cap/srv/ai-api/ai-api-service.cds b/sample-cap/srv/ai-api/ai-api-service.cds new file mode 100644 index 00000000..0b223c1d --- /dev/null +++ b/sample-cap/srv/ai-api/ai-api-service.cds @@ -0,0 +1,6 @@ +using { AiDeploymentsEntity } from '../../db/ai-api/ai-deployments-entity'; + +@path: 'ai-api' +service AiApiService { + entity Deployments as projection on AiDeploymentsEntity; +} diff --git a/sample-cap/srv/ai-api/ai-api-service.ts b/sample-cap/srv/ai-api/ai-api-service.ts new file mode 100644 index 00000000..c675c734 --- /dev/null +++ b/sample-cap/srv/ai-api/ai-api-service.ts @@ -0,0 +1,12 @@ +import { AiApiService, Deployments } from '#cds-models/AiApiService'; +import { DeploymentApi } from '@sap-ai-sdk/ai-api'; + +export = (srv: AiApiService) => { + srv.on('READ', Deployments.name, async _ => { + const response = await DeploymentApi.deploymentQuery( + {}, + { 'AI-Resource-Group': 'default' } + ).execute(); + return response.resources.map(({ id, deploymentUrl, status }) => ({ id, deploymentUrl, status })); + }); +}; diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts index f2892557..c585d45e 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.ts +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -4,8 +4,6 @@ import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; export = (srv: AzureOpenAiService) => { srv.on('CREATE', ChatCompletions.name, async req => { const { ID: _, ...chatCompletion } = req.data; - console.log(JSON.stringify(chatCompletion)); - const response = await new AzureOpenAiChatClient('gpt-35-turbo').run(chatCompletion); return req.info(response.getContent()); }); diff --git a/sample-cap/srv/index.cds b/sample-cap/srv/index.cds index 9f6f1bb5..c6dc9b4b 100644 --- a/sample-cap/srv/index.cds +++ b/sample-cap/srv/index.cds @@ -1 +1,3 @@ using from './foundation-models/azure-openai-service'; +using from './ai-api/ai-api-service'; +using from './orchestration/orchestration-service'; diff --git a/sample-cap/srv/orchestration/orchestration-service.cds b/sample-cap/srv/orchestration/orchestration-service.cds new file mode 100644 index 00000000..3a232438 --- /dev/null +++ b/sample-cap/srv/orchestration/orchestration-service.cds @@ -0,0 +1,6 @@ +using { OrchestrationChatCompletionsEntity } from '../../db/orchestration/orchestration-chat-completions-entity'; + +@path: 'orchestration' +service OrchestrationService { + entity ChatCompletions as projection on OrchestrationChatCompletionsEntity; +} diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts new file mode 100644 index 00000000..452b1643 --- /dev/null +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -0,0 +1,25 @@ +import { OrchestrationService, ChatCompletions } from '#cds-models/OrchestrationService'; +import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; + +export = (srv: OrchestrationService) => { + srv.on('CREATE', ChatCompletions.name, async req => { + const { template, inputParams } = req.data; + const llm = { + model_name: 'gpt-4-32k', + model_params: {} + } + const templating = { template }; + + const mappedInputParams = inputParams.reduce((acc, {name, value}) => { + acc[name] = value; + return acc; + }, {} as Record); + + const response = await new OrchestrationClient({ llm, templating }).chatCompletion({ + inputParams: mappedInputParams + }); + + return req.info(response.getContent()); + }); +}; + From 83646afd930717e469dcaf30cb9220e95e1cd6f2 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 30 Sep 2024 15:21:03 +0200 Subject: [PATCH 05/30] docs: add missing title --- sample-cap/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 50f4f310..9db32d0a 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -50,7 +50,7 @@ curl --request POST \ #### orchestration -##### +##### Chat Completions with Templating ```bash curl --request POST \ From a7a5a7a4d81aced8ec1f6a95895753dd08111818 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 30 Sep 2024 15:48:26 +0200 Subject: [PATCH 06/30] fix: use req.reply --- sample-cap/srv/ai-api/ai-api-service.ts | 6 ++++-- sample-cap/srv/foundation-models/azure-openai-service.ts | 9 ++++++--- sample-cap/srv/orchestration/orchestration-service.ts | 6 +++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sample-cap/srv/ai-api/ai-api-service.ts b/sample-cap/srv/ai-api/ai-api-service.ts index c675c734..b6058ebf 100644 --- a/sample-cap/srv/ai-api/ai-api-service.ts +++ b/sample-cap/srv/ai-api/ai-api-service.ts @@ -2,11 +2,13 @@ import { AiApiService, Deployments } from '#cds-models/AiApiService'; import { DeploymentApi } from '@sap-ai-sdk/ai-api'; export = (srv: AiApiService) => { - srv.on('READ', Deployments.name, async _ => { + srv.on('READ', Deployments.name, async req => { const response = await DeploymentApi.deploymentQuery( {}, { 'AI-Resource-Group': 'default' } ).execute(); - return response.resources.map(({ id, deploymentUrl, status }) => ({ id, deploymentUrl, status })); + req.reply( + response.resources.map(({ id, deploymentUrl, status }) => ({ id, deploymentUrl, status })) + ); }); }; diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts index c585d45e..6bc15e20 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.ts +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -3,8 +3,11 @@ import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; export = (srv: AzureOpenAiService) => { srv.on('CREATE', ChatCompletions.name, async req => { - const { ID: _, ...chatCompletion } = req.data; - const response = await new AzureOpenAiChatClient('gpt-35-turbo').run(chatCompletion); - return req.info(response.getContent()); + const { messages } = req.data; + const response = await new AzureOpenAiChatClient('gpt-35-turbo').run({ messages }); + return req.reply({ + messages, + content: response.getContent() + }); }); }; \ No newline at end of file diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index 452b1643..afd26689 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -19,7 +19,11 @@ export = (srv: OrchestrationService) => { inputParams: mappedInputParams }); - return req.info(response.getContent()); + return req.reply({ + template, + inputParams, + content: response.getContent() + }); }); }; From 65aa111a47ca0dcfc932b7181f2cda62971ce416 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 10:49:03 +0200 Subject: [PATCH 07/30] fix: remove cdsrc private --- sample-cap/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sample-cap/.gitignore b/sample-cap/.gitignore index eb696050..558b619f 100644 --- a/sample-cap/.gitignore +++ b/sample-cap/.gitignore @@ -32,3 +32,5 @@ mta_archives/ # @cap-js/cds-typer @cds-models + +.cdsrc-private.json From 50a74a46793f0dde1317f3cb8a4fc6cc67172415 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 10:49:18 +0200 Subject: [PATCH 08/30] fix: deps --- package.json | 4 ++++ pnpm-lock.yaml | 31 ++++++++++++++++++------------- sample-cap/package.json | 10 +++------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index eba9a226..6bfcb821 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,10 @@ "@sap-cloud-sdk/http-client": "^3.21.0", "@sap-cloud-sdk/openapi-generator": "^3.21.0", "@sap-cloud-sdk/util": "^3.21.0", + "@cap-js/sqlite": "^1", + "@cap-js/cds-types": "^0.6", + "@cap-js/cds-typer": ">=0.1", + "tsx": "^4.19.1", "@types/jest": "^29.5.13", "@types/jsonwebtoken": "^9.0.7", "@types/mock-fs": "^4.13.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b106f557..249e56d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,15 @@ importers: .: devDependencies: + '@cap-js/cds-typer': + specifier: '>=0.1' + version: 0.26.0(@cap-js/cds-types@0.6.5(@sap/cds@8.2.3(express@4.21.0)))(@sap/cds@8.2.3(express@4.21.0)) + '@cap-js/cds-types': + specifier: ^0.6 + version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) + '@cap-js/sqlite': + specifier: ^1 + version: 1.7.3(@sap/cds@8.2.3(express@4.21.0)) '@changesets/cli': specifier: ^2.27.8 version: 2.27.8 @@ -88,6 +97,9 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) + tsx: + specifier: ^4.19.1 + version: 4.19.1 typescript: specifier: ^5.6.2 version: 5.6.2 @@ -166,28 +178,21 @@ importers: sample-cap: dependencies: + '@sap-ai-sdk/ai-api': + specifier: workspace:^ + version: link:../packages/ai-api '@sap-ai-sdk/foundation-models': specifier: workspace:^ version: link:../packages/foundation-models + '@sap-ai-sdk/orchestration': + specifier: workspace:^ + version: link:../packages/orchestration '@sap/cds': specifier: ^8 version: 8.2.3(express@4.21.0) express: specifier: ^4 version: 4.21.0 - devDependencies: - '@cap-js/cds-typer': - specifier: '>=0.1' - version: 0.26.0(@cap-js/cds-types@0.6.5(@sap/cds@8.2.3(express@4.21.0)))(@sap/cds@8.2.3(express@4.21.0)) - '@cap-js/cds-types': - specifier: ^0.6 - version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) - '@cap-js/sqlite': - specifier: ^1 - version: 1.7.3(@sap/cds@8.2.3(express@4.21.0)) - tsx: - specifier: ^4.19.1 - version: 4.19.1 sample-code: dependencies: diff --git a/sample-cap/package.json b/sample-cap/package.json index 37075a50..25779b0b 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -9,13 +9,9 @@ "dependencies": { "@sap/cds": "^8", "express": "^4", - "@sap-ai-sdk/foundation-models": "workspace:^" - }, - "devDependencies": { - "@cap-js/sqlite": "^1", - "@cap-js/cds-types": "^0.6", - "@cap-js/cds-typer": ">=0.1", - "tsx": "^4.19.1" + "@sap-ai-sdk/ai-api": "workspace:^", + "@sap-ai-sdk/foundation-models": "workspace:^", + "@sap-ai-sdk/orchestration": "workspace:^" }, "scripts": { "start": "cds-tsx serve", From 6fa114632130511f15e366f1cb27b266176e6157 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 10:56:08 +0200 Subject: [PATCH 09/30] fix: lint --- package.json | 2 ++ sample-cap/README.md | 18 ++++++------- sample-cap/eslint.config.mjs | 4 +-- sample-cap/jsconfig.json | 4 +-- sample-cap/package.json | 4 ++- sample-cap/srv/ai-api/ai-api-service.ts | 6 ++++- .../foundation-models/azure-openai-service.ts | 11 +++++--- .../orchestration/orchestration-service.ts | 26 ++++++++++++------- 8 files changed, 47 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 6bfcb821..fe123b9f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "type-tests": "pnpm -F=@sap-ai-sdk/type-tests", "smoke-tests": "pnpm -F=@sap-ai-sdk/smoke-tests", "schema-tests": "pnpm -F=@sap-ai-sdk/schema-tests", + "sample-code": "pnpm -F=@sap-ai-sdk/sample-code", + "sample-cap": "pnpm -F=@sap-ai-sdk/sample-cap", "check:public-api": "pnpm -r check:public-api", "check:deps": "pnpm -r -F !./tests/smoke-tests -F !./tests/schema-tests exec depcheck --ignores=\"nock,@jest/globals\" --quiet" }, diff --git a/sample-cap/README.md b/sample-cap/README.md index 9db32d0a..98679b2c 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -1,6 +1,6 @@ # Sample CAP Application with SAP Cloud SDK for AI -Sample CAP application written in TypeScript to demonstrate the usage of SAP Cloud SDK for AI. +Sample CAP application written in TypeScript to demonstrate the usage of SAP Cloud SDK for AI. ## Build and Run Locally @@ -8,15 +8,15 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo 2. Bind the application to your AI Core instance: - ```bash - cds bind -2 AI_CORE_INSTANCE_NAME - ``` + ```bash + cds bind -2 AI_CORE_INSTANCE_NAME + ``` -3. Run the application: +3. Run the application: - ```bash - cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start - ``` + ```bash + cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start + ``` ### Usage @@ -58,7 +58,7 @@ curl --request POST \ --header 'Content-Type: application/json' \ --data '{ "template": [ - { + { "role": "user", "content": "What is the capital of {{?country}}" } diff --git a/sample-cap/eslint.config.mjs b/sample-cap/eslint.config.mjs index 2fdb4320..d762606f 100644 --- a/sample-cap/eslint.config.mjs +++ b/sample-cap/eslint.config.mjs @@ -1,2 +1,2 @@ -import cds from '@sap/cds/eslint.config.mjs' -export default [ ...cds.recommended ] +import cds from '@sap/cds/eslint.config.mjs'; +export default [...cds.recommended]; diff --git a/sample-cap/jsconfig.json b/sample-cap/jsconfig.json index 9cad509e..e74af340 100644 --- a/sample-cap/jsconfig.json +++ b/sample-cap/jsconfig.json @@ -2,9 +2,7 @@ "compilerOptions": { "moduleResolution": "nodenext", "paths": { - "#cds-models/*": [ - "./@cds-models/*" - ] + "#cds-models/*": ["./@cds-models/*"] } } } diff --git a/sample-cap/package.json b/sample-cap/package.json index 25779b0b..6d45e6e0 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -15,7 +15,9 @@ }, "scripts": { "start": "cds-tsx serve", - "watch": "cds-tsx watch" + "watch": "cds-tsx watch", + "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", + "lint:fix": "eslint . --fix && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -w --log-level error" }, "imports": { "#cds-models/*": "./@cds-models/*/index.js" diff --git a/sample-cap/srv/ai-api/ai-api-service.ts b/sample-cap/srv/ai-api/ai-api-service.ts index b6058ebf..debefe76 100644 --- a/sample-cap/srv/ai-api/ai-api-service.ts +++ b/sample-cap/srv/ai-api/ai-api-service.ts @@ -8,7 +8,11 @@ export = (srv: AiApiService) => { { 'AI-Resource-Group': 'default' } ).execute(); req.reply( - response.resources.map(({ id, deploymentUrl, status }) => ({ id, deploymentUrl, status })) + response.resources.map(({ id, deploymentUrl, status }) => ({ + id, + deploymentUrl, + status + })) ); }); }; diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts index 6bc15e20..9e5adea7 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.ts +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -1,13 +1,18 @@ -import { AzureOpenAiService, ChatCompletions } from '#cds-models/AzureOpenAiService'; +import { + AzureOpenAiService, + ChatCompletions +} from '#cds-models/AzureOpenAiService'; import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; export = (srv: AzureOpenAiService) => { srv.on('CREATE', ChatCompletions.name, async req => { const { messages } = req.data; - const response = await new AzureOpenAiChatClient('gpt-35-turbo').run({ messages }); + const response = await new AzureOpenAiChatClient('gpt-35-turbo').run({ + messages + }); return req.reply({ messages, content: response.getContent() }); }); -}; \ No newline at end of file +}; diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index afd26689..ba3b6dd0 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -1,4 +1,7 @@ -import { OrchestrationService, ChatCompletions } from '#cds-models/OrchestrationService'; +import { + OrchestrationService, + ChatCompletions +} from '#cds-models/OrchestrationService'; import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; export = (srv: OrchestrationService) => { @@ -7,15 +10,21 @@ export = (srv: OrchestrationService) => { const llm = { model_name: 'gpt-4-32k', model_params: {} - } + }; const templating = { template }; - const mappedInputParams = inputParams.reduce((acc, {name, value}) => { - acc[name] = value; - return acc; - }, {} as Record); - - const response = await new OrchestrationClient({ llm, templating }).chatCompletion({ + const mappedInputParams = inputParams.reduce( + (acc, { name, value }) => { + acc[name] = value; + return acc; + }, + {} as Record + ); + + const response = await new OrchestrationClient({ + llm, + templating + }).chatCompletion({ inputParams: mappedInputParams }); @@ -26,4 +35,3 @@ export = (srv: OrchestrationService) => { }); }); }; - From 7f8c9f33963c12d4710f49005e69cdf7d29bbb8e Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 11:20:28 +0200 Subject: [PATCH 10/30] chore: small changes in cap gitignore --- sample-cap/.gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-cap/.gitignore b/sample-cap/.gitignore index 558b619f..eb0f2722 100644 --- a/sample-cap/.gitignore +++ b/sample-cap/.gitignore @@ -1,4 +1,4 @@ -# CAP bookshop +# CAP _out *.db *.sqlite @@ -27,8 +27,8 @@ mta_archives/ *.flattened-pom.xml # IDEs -# .vscode -# .idea +.vscode +.idea # @cap-js/cds-typer @cds-models From 0b4852977e0e647e5682b0226498cfd7af8497ab Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 11:30:24 +0200 Subject: [PATCH 11/30] docs: update README.md --- sample-cap/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 98679b2c..354ac444 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -6,13 +6,15 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo 1. Build the application with `pnpm install`. -2. Bind the application to your AI Core instance: +2. Login using `cf login -a API_ENDPOINT -o ORG -s SPACE`. + +3. Bind the application to your AI Core instance: ```bash cds bind -2 AI_CORE_INSTANCE_NAME ``` -3. Run the application: +4. Run the application with the binding: ```bash cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start @@ -20,7 +22,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ### Usage -#### ai-api +#### `ai-api` ##### Deployment API @@ -30,7 +32,7 @@ curl --request GET \ --header 'Content-Type: application/json' ``` -#### foundation-models +#### `foundation-models` ##### Azure OpenAI Chat Completion @@ -48,7 +50,7 @@ curl --request POST \ }' ``` -#### orchestration +#### `orchestration` ##### Chat Completions with Templating From 03641d816b60dd3cbd823d7115384acff6e4d611 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 16:15:15 +0200 Subject: [PATCH 12/30] docs: add toc --- sample-cap/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sample-cap/README.md b/sample-cap/README.md index 354ac444..70cc2a2b 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -2,6 +2,17 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Cloud SDK for AI. +### Table of Contents + +- [Build and Run Locally](#build-and-run-locally) + - [Usage](#usage) + - [`ai-api`](#ai-api) + - [Deployment API](#deployment-api) + - [`foundation-models`](#foundation-models) + - [Azure OpenAI Chat Completion](#azure-openai-chat-completion) + - [`orchestration`](#orchestration) + - [Chat Completions with Templating](#chat-completions-with-templating) + ## Build and Run Locally 1. Build the application with `pnpm install`. From dc5a3c5b3ef4f80d27c060bafbd36257e1f649da Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 16:16:54 +0200 Subject: [PATCH 13/30] docs: rename --- sample-cap/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 70cc2a2b..2dd786f7 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -4,8 +4,8 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ### Table of Contents -- [Build and Run Locally](#build-and-run-locally) - - [Usage](#usage) +- [Local Deployment](#local-deployment) +- [Usage](#usage) - [`ai-api`](#ai-api) - [Deployment API](#deployment-api) - [`foundation-models`](#foundation-models) @@ -13,7 +13,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo - [`orchestration`](#orchestration) - [Chat Completions with Templating](#chat-completions-with-templating) -## Build and Run Locally +## Local Deployment 1. Build the application with `pnpm install`. @@ -31,7 +31,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start ``` -### Usage +## Usage #### `ai-api` From 9588531f5a9fdde7777cb8dff60587a8bddee363 Mon Sep 17 00:00:00 2001 From: cloud-sdk-js Date: Tue, 1 Oct 2024 14:17:49 +0000 Subject: [PATCH 14/30] fix: Changes from lint --- sample-cap/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 2dd786f7..4cff34ee 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -6,12 +6,12 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo - [Local Deployment](#local-deployment) - [Usage](#usage) - - [`ai-api`](#ai-api) - - [Deployment API](#deployment-api) - - [`foundation-models`](#foundation-models) - - [Azure OpenAI Chat Completion](#azure-openai-chat-completion) - - [`orchestration`](#orchestration) - - [Chat Completions with Templating](#chat-completions-with-templating) + - [`ai-api`](#ai-api) + - [Deployment API](#deployment-api) + - [`foundation-models`](#foundation-models) + - [Azure OpenAI Chat Completion](#azure-openai-chat-completion) + - [`orchestration`](#orchestration) + - [Chat Completions with Templating](#chat-completions-with-templating) ## Local Deployment From efbd591951ef19b09f47e1336bf32075823ecbe0 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 18:00:47 +0200 Subject: [PATCH 15/30] docs: small changes --- sample-cap/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 4cff34ee..be8e2668 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -33,9 +33,9 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ## Usage -#### `ai-api` +### `ai-api` -##### Deployment API +#### Deployment API ```bash curl --request GET \ @@ -43,9 +43,9 @@ curl --request GET \ --header 'Content-Type: application/json' ``` -#### `foundation-models` +### `foundation-models` -##### Azure OpenAI Chat Completion +#### Azure OpenAI Chat Completion ```bash curl --request POST \ @@ -61,9 +61,9 @@ curl --request POST \ }' ``` -#### `orchestration` +### `orchestration` -##### Chat Completions with Templating +#### Chat Completions with Templating ```bash curl --request POST \ From 9c3dfb05ac5415715a254f000d9f8e2e81663008 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Tue, 1 Oct 2024 18:10:22 +0200 Subject: [PATCH 16/30] chore: add changeset --- .changeset/sweet-lies-confess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/sweet-lies-confess.md diff --git a/.changeset/sweet-lies-confess.md b/.changeset/sweet-lies-confess.md new file mode 100644 index 00000000..553600a8 --- /dev/null +++ b/.changeset/sweet-lies-confess.md @@ -0,0 +1,5 @@ +--- +'@sap-ai-sdk/sample-cap': patch +--- + +[New Functionality] Introduce a new sample application based on SAP CAP framework. From 50b2eab77f2b97806bf235938f2b41c8d24736a4 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Fri, 4 Oct 2024 12:15:14 +0200 Subject: [PATCH 17/30] refactor: use actions instead of entity projection --- package.json | 1 - sample-cap/README.md | 7 +++---- .../db/ai-api/ai-deployments-entity.cds | 15 --------------- .../azure-openai-chat-completions-entity.cds | 6 ------ .../orchestration-chat-completions-entity.cds | 7 ------- sample-cap/srv/ai-api/ai-api-service.cds | 5 ++--- sample-cap/srv/ai-api/ai-api-service.ts | 17 +++++------------ .../azure-openai-service.cds | 4 ++-- .../foundation-models/azure-openai-service.ts | 18 ++++++------------ .../orchestration/orchestration-service.cds | 4 ++-- .../orchestration/orchestration-service.ts | 19 ++++++------------- 11 files changed, 26 insertions(+), 77 deletions(-) delete mode 100644 sample-cap/db/ai-api/ai-deployments-entity.cds diff --git a/package.json b/package.json index fe123b9f..2288f749 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "@sap-cloud-sdk/util": "^3.21.0", "@cap-js/sqlite": "^1", "@cap-js/cds-types": "^0.6", - "@cap-js/cds-typer": ">=0.1", "tsx": "^4.19.1", "@types/jest": "^29.5.13", "@types/jsonwebtoken": "^9.0.7", diff --git a/sample-cap/README.md b/sample-cap/README.md index be8e2668..859c75ae 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -39,8 +39,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo ```bash curl --request GET \ - --url 'http://localhost:4004/odata/v4/ai-api/Deployments' \ - --header 'Content-Type: application/json' + --url 'http://localhost:4004/odata/v4/ai-api/getDeployments' ``` ### `foundation-models` @@ -49,7 +48,7 @@ curl --request GET \ ```bash curl --request POST \ - --url 'http://localhost:4004/odata/v4/azure-openai/ChatCompletions' \ + --url 'http://localhost:4004/odata/v4/azure-openai/chatCompletions' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ @@ -67,7 +66,7 @@ curl --request POST \ ```bash curl --request POST \ - --url 'http://localhost:4004/odata/v4/orchestration/ChatCompletions' \ + --url 'http://localhost:4004/odata/v4/orchestration/chatCompletions' \ --header 'Content-Type: application/json' \ --data '{ "template": [ diff --git a/sample-cap/db/ai-api/ai-deployments-entity.cds b/sample-cap/db/ai-api/ai-deployments-entity.cds deleted file mode 100644 index 192d2550..00000000 --- a/sample-cap/db/ai-api/ai-deployments-entity.cds +++ /dev/null @@ -1,15 +0,0 @@ -entity AiDeploymentsEntity { - key id : String @assert.format: '[\\w.-]{4,64}'; - deploymentUrl : String; - status : AiDeploymentStatus; -} - -type AiDeploymentStatus : String enum { - PENDING; - RUNNING; - COMPLETED; - DEAD; - STOPPING; - STOPPED; - UNKNOWN; -} diff --git a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds index 3a81e517..0af47126 100644 --- a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds +++ b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds @@ -1,9 +1,3 @@ -using {cuid} from '@sap/cds/common'; - -entity AzureOpenAiChatCompletionsEntity : cuid { - messages : many Message; -} - type Message { role : String; content : String; diff --git a/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds b/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds index 4c247067..0ce5c2f9 100644 --- a/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds +++ b/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds @@ -1,10 +1,3 @@ -using {cuid} from '@sap/cds/common'; - -entity OrchestrationChatCompletionsEntity : cuid { - template : many Template; - inputParams : many InputParam; -} - type Template { role : String; content : String; diff --git a/sample-cap/srv/ai-api/ai-api-service.cds b/sample-cap/srv/ai-api/ai-api-service.cds index 0b223c1d..0243442f 100644 --- a/sample-cap/srv/ai-api/ai-api-service.cds +++ b/sample-cap/srv/ai-api/ai-api-service.cds @@ -1,6 +1,5 @@ -using { AiDeploymentsEntity } from '../../db/ai-api/ai-deployments-entity'; - @path: 'ai-api' service AiApiService { - entity Deployments as projection on AiDeploymentsEntity; + // entity Deployments as projection on AiDeploymentsEntity; + action getDeployments() returns String; } diff --git a/sample-cap/srv/ai-api/ai-api-service.ts b/sample-cap/srv/ai-api/ai-api-service.ts index debefe76..6b2dbdc3 100644 --- a/sample-cap/srv/ai-api/ai-api-service.ts +++ b/sample-cap/srv/ai-api/ai-api-service.ts @@ -1,18 +1,11 @@ -import { AiApiService, Deployments } from '#cds-models/AiApiService'; import { DeploymentApi } from '@sap-ai-sdk/ai-api'; -export = (srv: AiApiService) => { - srv.on('READ', Deployments.name, async req => { +export default class AiApiService { + async getDeployments() { const response = await DeploymentApi.deploymentQuery( {}, { 'AI-Resource-Group': 'default' } ).execute(); - req.reply( - response.resources.map(({ id, deploymentUrl, status }) => ({ - id, - deploymentUrl, - status - })) - ); - }); -}; + return response.resources; + } +} diff --git a/sample-cap/srv/foundation-models/azure-openai-service.cds b/sample-cap/srv/foundation-models/azure-openai-service.cds index 6831fba3..cdde5d5e 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.cds +++ b/sample-cap/srv/foundation-models/azure-openai-service.cds @@ -1,6 +1,6 @@ -using { AzureOpenAiChatCompletionsEntity } from '../../db/foundation-models/azure-openai-chat-completions-entity'; +using {Message} from '../../db/foundation-models/azure-openai-chat-completions-entity'; @path: 'azure-openai' service AzureOpenAiService { - entity ChatCompletions as projection on AzureOpenAiChatCompletionsEntity; + action chatCompletions(messages : array of Message) returns String; } diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts index 9e5adea7..8b3971ca 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.ts +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -1,18 +1,12 @@ -import { - AzureOpenAiService, - ChatCompletions -} from '#cds-models/AzureOpenAiService'; +import { Request } from '@sap/cds'; import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; -export = (srv: AzureOpenAiService) => { - srv.on('CREATE', ChatCompletions.name, async req => { +export default class AzureOpenAiService { + async chatCompletions(req: Request) { const { messages } = req.data; const response = await new AzureOpenAiChatClient('gpt-35-turbo').run({ messages }); - return req.reply({ - messages, - content: response.getContent() - }); - }); -}; + return response.getContent(); + } +} diff --git a/sample-cap/srv/orchestration/orchestration-service.cds b/sample-cap/srv/orchestration/orchestration-service.cds index 3a232438..5eedf2f6 100644 --- a/sample-cap/srv/orchestration/orchestration-service.cds +++ b/sample-cap/srv/orchestration/orchestration-service.cds @@ -1,6 +1,6 @@ -using { OrchestrationChatCompletionsEntity } from '../../db/orchestration/orchestration-chat-completions-entity'; +using { Template, InputParam } from '../../db/orchestration/orchestration-chat-completions-entity'; @path: 'orchestration' service OrchestrationService { - entity ChatCompletions as projection on OrchestrationChatCompletionsEntity; + action chatCompletions(template: array of Template, inputParams: array of InputParam) returns String; } diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index ba3b6dd0..831808d8 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -1,11 +1,8 @@ -import { - OrchestrationService, - ChatCompletions -} from '#cds-models/OrchestrationService'; +import { Request as CdsRequest } from '@sap/cds'; import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; -export = (srv: OrchestrationService) => { - srv.on('CREATE', ChatCompletions.name, async req => { +export default class OrchestrationService { + async chatCompletions(req: CdsRequest) { const { template, inputParams } = req.data; const llm = { model_name: 'gpt-4-32k', @@ -28,10 +25,6 @@ export = (srv: OrchestrationService) => { inputParams: mappedInputParams }); - return req.reply({ - template, - inputParams, - content: response.getContent() - }); - }); -}; + return response.getContent(); + } +} From 6bfaa16039c0fb75509e3dac645d41c302f0d3af Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Fri, 4 Oct 2024 12:20:38 +0200 Subject: [PATCH 18/30] chore: format cds --- sample-cap/srv/orchestration/orchestration-service.cds | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sample-cap/srv/orchestration/orchestration-service.cds b/sample-cap/srv/orchestration/orchestration-service.cds index 5eedf2f6..8e7cf6c9 100644 --- a/sample-cap/srv/orchestration/orchestration-service.cds +++ b/sample-cap/srv/orchestration/orchestration-service.cds @@ -1,6 +1,9 @@ -using { Template, InputParam } from '../../db/orchestration/orchestration-chat-completions-entity'; +using { + Template, + InputParam +} from '../../db/orchestration/orchestration-chat-completions-entity'; @path: 'orchestration' service OrchestrationService { - action chatCompletions(template: array of Template, inputParams: array of InputParam) returns String; + action chatCompletions(template : array of Template, inputParams : array of InputParam) returns String; } From c86a07cb8fe464ccc014ee237b67d32c49a4a530 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 09:01:18 +0200 Subject: [PATCH 19/30] review --- sample-cap/README.md | 2 +- sample-cap/package.json | 2 +- .../srv/foundation-models/azure-openai-service.cds | 2 +- sample-cap/srv/foundation-models/azure-openai-service.ts | 2 +- sample-cap/srv/orchestration/orchestration-service.cds | 2 +- sample-cap/srv/orchestration/orchestration-service.ts | 9 +++------ 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 859c75ae..0a244745 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -28,7 +28,7 @@ Sample CAP application written in TypeScript to demonstrate the usage of SAP Clo 4. Run the application with the binding: ```bash - cds bind -2 AI_CORE_INSTANCE_NAME --exec -- pnpm start + pnpm watch:hybrid ``` ## Usage diff --git a/sample-cap/package.json b/sample-cap/package.json index 6d45e6e0..cbc05798 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -14,8 +14,8 @@ "@sap-ai-sdk/orchestration": "workspace:^" }, "scripts": { - "start": "cds-tsx serve", "watch": "cds-tsx watch", + "watch:hybrid": "cds-tsx watch --profile hybrid", "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -w --log-level error" }, diff --git a/sample-cap/srv/foundation-models/azure-openai-service.cds b/sample-cap/srv/foundation-models/azure-openai-service.cds index cdde5d5e..c6b15ee9 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.cds +++ b/sample-cap/srv/foundation-models/azure-openai-service.cds @@ -2,5 +2,5 @@ using {Message} from '../../db/foundation-models/azure-openai-chat-completions-e @path: 'azure-openai' service AzureOpenAiService { - action chatCompletions(messages : array of Message) returns String; + action chatCompletion(messages : array of Message) returns String; } diff --git a/sample-cap/srv/foundation-models/azure-openai-service.ts b/sample-cap/srv/foundation-models/azure-openai-service.ts index 8b3971ca..81ec3ef2 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.ts +++ b/sample-cap/srv/foundation-models/azure-openai-service.ts @@ -2,7 +2,7 @@ import { Request } from '@sap/cds'; import { AzureOpenAiChatClient } from '@sap-ai-sdk/foundation-models'; export default class AzureOpenAiService { - async chatCompletions(req: Request) { + async chatCompletion(req: Request) { const { messages } = req.data; const response = await new AzureOpenAiChatClient('gpt-35-turbo').run({ messages diff --git a/sample-cap/srv/orchestration/orchestration-service.cds b/sample-cap/srv/orchestration/orchestration-service.cds index 8e7cf6c9..dd6fc818 100644 --- a/sample-cap/srv/orchestration/orchestration-service.cds +++ b/sample-cap/srv/orchestration/orchestration-service.cds @@ -5,5 +5,5 @@ using { @path: 'orchestration' service OrchestrationService { - action chatCompletions(template : array of Template, inputParams : array of InputParam) returns String; + action chatCompletion(template : array of Template, inputParams : array of InputParam) returns String; } diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index 831808d8..b68a3fc6 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -1,8 +1,8 @@ -import { Request as CdsRequest } from '@sap/cds'; +import { Request } from '@sap/cds'; import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; export default class OrchestrationService { - async chatCompletions(req: CdsRequest) { + async chatCompletion(req: Request) { const { template, inputParams } = req.data; const llm = { model_name: 'gpt-4-32k', @@ -11,10 +11,7 @@ export default class OrchestrationService { const templating = { template }; const mappedInputParams = inputParams.reduce( - (acc, { name, value }) => { - acc[name] = value; - return acc; - }, + (acc, { name, value }) => ({ ...acc, [name]: value }), {} as Record ); From 9b889f7f7c01683697d5f3b69fc458e29f8fe3e5 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 10:44:59 +0200 Subject: [PATCH 20/30] review --- package.json | 1 - sample-cap/db/.gitkeep | 0 .../azure-openai-chat-completions-entity.cds | 4 --- .../orchestration-chat-completions-entity.cds | 9 ----- sample-cap/srv/ai-api/ai-api-service.cds | 4 +-- .../azure-openai-service.cds | 7 ++-- .../orchestration/orchestration-service.cds | 15 +++++--- .../orchestration/orchestration-service.ts | 35 ++++++++++++++++--- 8 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 sample-cap/db/.gitkeep delete mode 100644 sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds delete mode 100644 sample-cap/db/orchestration/orchestration-chat-completions-entity.cds diff --git a/package.json b/package.json index 193cae4c..018c9fe5 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "@sap-cloud-sdk/http-client": "^3.21.0", "@sap-cloud-sdk/openapi-generator": "^3.21.0", "@sap-cloud-sdk/util": "^3.21.0", - "@cap-js/sqlite": "^1", "@cap-js/cds-types": "^0.6", "tsx": "^4.19.1", "@types/jest": "^29.5.13", diff --git a/sample-cap/db/.gitkeep b/sample-cap/db/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds b/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds deleted file mode 100644 index 0af47126..00000000 --- a/sample-cap/db/foundation-models/azure-openai-chat-completions-entity.cds +++ /dev/null @@ -1,4 +0,0 @@ -type Message { - role : String; - content : String; -} diff --git a/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds b/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds deleted file mode 100644 index 0ce5c2f9..00000000 --- a/sample-cap/db/orchestration/orchestration-chat-completions-entity.cds +++ /dev/null @@ -1,9 +0,0 @@ -type Template { - role : String; - content : String; -} - -type InputParam { - name : String; - value : String; -} diff --git a/sample-cap/srv/ai-api/ai-api-service.cds b/sample-cap/srv/ai-api/ai-api-service.cds index 0243442f..8a9d0404 100644 --- a/sample-cap/srv/ai-api/ai-api-service.cds +++ b/sample-cap/srv/ai-api/ai-api-service.cds @@ -1,5 +1,5 @@ @path: 'ai-api' service AiApiService { - // entity Deployments as projection on AiDeploymentsEntity; - action getDeployments() returns String; + // Technically, it should return an array of AiDeployment entity if we define it in the model. + action getDeployments() returns array of String; } diff --git a/sample-cap/srv/foundation-models/azure-openai-service.cds b/sample-cap/srv/foundation-models/azure-openai-service.cds index c6b15ee9..9609cbea 100644 --- a/sample-cap/srv/foundation-models/azure-openai-service.cds +++ b/sample-cap/srv/foundation-models/azure-openai-service.cds @@ -1,6 +1,9 @@ -using {Message} from '../../db/foundation-models/azure-openai-chat-completions-entity'; - @path: 'azure-openai' service AzureOpenAiService { action chatCompletion(messages : array of Message) returns String; } + +type Message { + role : String; + content : String; +} diff --git a/sample-cap/srv/orchestration/orchestration-service.cds b/sample-cap/srv/orchestration/orchestration-service.cds index dd6fc818..6b4afdb1 100644 --- a/sample-cap/srv/orchestration/orchestration-service.cds +++ b/sample-cap/srv/orchestration/orchestration-service.cds @@ -1,9 +1,14 @@ -using { - Template, - InputParam -} from '../../db/orchestration/orchestration-chat-completions-entity'; - @path: 'orchestration' service OrchestrationService { action chatCompletion(template : array of Template, inputParams : array of InputParam) returns String; } + +type Template { + role : String; + content : String; +} + +type InputParam { + name : String; + value : String; +} diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index b68a3fc6..4b1a035d 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -10,18 +10,43 @@ export default class OrchestrationService { }; const templating = { template }; - const mappedInputParams = inputParams.reduce( - (acc, { name, value }) => ({ ...acc, [name]: value }), - {} as Record - ); + + const response = await new OrchestrationClient({ llm, templating }).chatCompletion({ - inputParams: mappedInputParams + inputParams: mapInputParams(inputParams) }); return response.getContent(); } } + +/** + * Map input parameters since CAP does not support dynamic object keys. + * + * For example: + * + * ```ts + * inputParams: [{ + * name: 'param1', + * value: 'value1' + * }] + * ``` + * => + * ```ts + * mappedInputParams: { + * param1: 'value1' + * } + * ``` + * @param inputParams - Array of `InputParam` entity. + * @returns Mapped input parameters for AI Core. + */ +function mapInputParams(inputParams: { name: string; value: string }[]): Record { + return inputParams.reduce( + (acc, { name, value }) => ({ ...acc, [name]: value }), + {} as Record + ); +} \ No newline at end of file From 551d6b1f378498e379b375cff4fb58e18e99df8e Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 10:46:15 +0200 Subject: [PATCH 21/30] docs: update README.md --- sample-cap/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample-cap/README.md b/sample-cap/README.md index 0a244745..0746a213 100644 --- a/sample-cap/README.md +++ b/sample-cap/README.md @@ -48,7 +48,7 @@ curl --request GET \ ```bash curl --request POST \ - --url 'http://localhost:4004/odata/v4/azure-openai/chatCompletions' \ + --url 'http://localhost:4004/odata/v4/azure-openai/chatCompletion' \ --header 'Content-Type: application/json' \ --data '{ "messages": [ @@ -66,7 +66,7 @@ curl --request POST \ ```bash curl --request POST \ - --url 'http://localhost:4004/odata/v4/orchestration/chatCompletions' \ + --url 'http://localhost:4004/odata/v4/orchestration/chatCompletion' \ --header 'Content-Type: application/json' \ --data '{ "template": [ From f4f71fa6f3981741fac570c45517ec3fbfb38e3c Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 10:46:32 +0200 Subject: [PATCH 22/30] fix: lint --- .../srv/orchestration/orchestration-service.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sample-cap/srv/orchestration/orchestration-service.ts b/sample-cap/srv/orchestration/orchestration-service.ts index 4b1a035d..d8ddb7f6 100644 --- a/sample-cap/srv/orchestration/orchestration-service.ts +++ b/sample-cap/srv/orchestration/orchestration-service.ts @@ -10,9 +10,6 @@ export default class OrchestrationService { }; const templating = { template }; - - - const response = await new OrchestrationClient({ llm, templating @@ -26,9 +23,9 @@ export default class OrchestrationService { /** * Map input parameters since CAP does not support dynamic object keys. - * + * * For example: - * + * * ```ts * inputParams: [{ * name: 'param1', @@ -44,9 +41,11 @@ export default class OrchestrationService { * @param inputParams - Array of `InputParam` entity. * @returns Mapped input parameters for AI Core. */ -function mapInputParams(inputParams: { name: string; value: string }[]): Record { +function mapInputParams( + inputParams: { name: string; value: string }[] +): Record { return inputParams.reduce( (acc, { name, value }) => ({ ...acc, [name]: value }), {} as Record ); -} \ No newline at end of file +} From 88823d2971a65cf1ce6608fbeb1b6f8924012e4b Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 10:48:12 +0200 Subject: [PATCH 23/30] fix: lock --- pnpm-lock.yaml | 204 ------------------------------------------------- 1 file changed, 204 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 477d5c4b..4904ae44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,9 +13,6 @@ importers: '@cap-js/cds-types': specifier: ^0.6 version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) - '@cap-js/sqlite': - specifier: ^1 - version: 1.7.3(@sap/cds@8.2.3(express@4.21.0)) '@changesets/cli': specifier: ^2.27.9 version: 2.27.9 @@ -513,16 +510,6 @@ packages: peerDependencies: '@sap/cds': ^8.0.0 - '@cap-js/db-service@1.12.1': - resolution: {integrity: sha512-0sIyXK/osLIywIVdGj8CSVjSqGh1tjqImU9NPeAIfUxAtx7lBbuhwZdNpolxw6YfmCyWeIogJEzh0Nb3LWF8tQ==} - peerDependencies: - '@sap/cds': '>=7.9' - - '@cap-js/sqlite@1.7.3': - resolution: {integrity: sha512-pNVOICqTuMHndeLtXrGopH/85Fe0lNHjWXHmiQGiQTD4nlwbMruNBRbclXuDi+SgpFWTLcpLpGrnaLDdX+mMOg==} - peerDependencies: - '@sap/cds': '>=7.6' - '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -1516,9 +1503,6 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - better-sqlite3@11.3.0: - resolution: {integrity: sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w==} - big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} @@ -1526,9 +1510,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1633,9 +1614,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1827,10 +1805,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -1839,10 +1813,6 @@ packages: babel-plugin-macros: optional: true - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1889,10 +1859,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1983,9 +1949,6 @@ packages: encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -2217,10 +2180,6 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -2291,9 +2250,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -2362,9 +2318,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2426,9 +2379,6 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3233,10 +3183,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3271,9 +3217,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mock-fs@5.3.0: resolution: {integrity: sha512-IMvz1X+RF7vf+ur7qUenXMR7/FSKSIqS3HqFHXcyNI7G0FbpFO8L5lfsUJhl+bhK1AiulVHWKUSxebWauPA+xQ==} engines: {node: '>=12.0.0'} @@ -3307,9 +3250,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3321,10 +3261,6 @@ packages: resolution: {integrity: sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==} engines: {node: '>= 10.13'} - node-abi@3.68.0: - resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} - engines: {node: '>=10'} - node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} @@ -3608,11 +3544,6 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3658,9 +3589,6 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3687,10 +3615,6 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -3886,12 +3810,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3995,10 +3913,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4031,13 +3945,6 @@ packages: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -4164,9 +4071,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4676,17 +4580,6 @@ snapshots: '@sap/cds': 8.2.3(express@4.21.0) '@types/express': 4.17.21 - '@cap-js/db-service@1.12.1(@sap/cds@8.2.3(express@4.21.0))': - dependencies: - '@sap/cds': 8.2.3(express@4.21.0) - generic-pool: 3.9.0 - - '@cap-js/sqlite@1.7.3(@sap/cds@8.2.3(express@4.21.0))': - dependencies: - '@cap-js/db-service': 1.12.1(@sap/cds@8.2.3(express@4.21.0)) - '@sap/cds': 8.2.3(express@4.21.0) - better-sqlite3: 11.3.0 - '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -6107,19 +6000,10 @@ snapshots: dependencies: is-windows: 1.0.2 - better-sqlite3@11.3.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - big.js@6.2.2: {} binary-extensions@2.3.0: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -6265,8 +6149,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: {} - ci-info@3.9.0: {} ci-info@4.0.0: {} @@ -6437,14 +6319,8 @@ snapshots: decamelize@1.2.0: {} - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - dedent@1.5.3: {} - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -6505,8 +6381,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.3: {} - detect-newline@3.1.0: {} diff-sequences@29.6.3: {} @@ -6588,10 +6462,6 @@ snapshots: whatwg-encoding: 3.1.1 optional: true - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -6921,8 +6791,6 @@ snapshots: exit@0.1.2: {} - expand-template@2.0.3: {} - expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 @@ -7032,8 +6900,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-uri-to-path@1.0.0: {} - filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -7108,8 +6974,6 @@ snapshots: fresh@0.5.2: {} - fs-constants@1.0.0: {} - fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -7172,8 +7036,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - github-from-package@0.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -8192,8 +8054,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-response@3.1.0: {} - min-indent@1.0.1: {} minimatch@10.0.1: @@ -8226,8 +8086,6 @@ snapshots: minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} - mock-fs@5.3.0: {} mri@1.2.0: {} @@ -8252,8 +8110,6 @@ snapshots: nanoid@3.3.7: {} - napi-build-utils@1.0.2: {} - natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -8266,10 +8122,6 @@ snapshots: transitivePeerDependencies: - supports-color - node-abi@3.68.0: - dependencies: - semver: 7.6.3 - node-cache@5.1.2: dependencies: clone: 2.1.2 @@ -8573,21 +8425,6 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 - prebuild-install@7.1.2: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.68.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -8623,11 +8460,6 @@ snapshots: pseudomap@1.0.2: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -8649,13 +8481,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-is@18.3.1: {} read-pkg-up@7.0.1: @@ -8873,14 +8698,6 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -8990,8 +8807,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} supports-color@5.5.0: @@ -9034,21 +8849,6 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.7.0 - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - term-size@2.2.1: {} test-exclude@6.0.0: @@ -9193,10 +8993,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 From fd9b4bc0ae1a5792b5c3f8fb2f8a3dc3aa8bc8ff Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 17:29:44 +0200 Subject: [PATCH 24/30] fix: remove changeset --- .changeset/sweet-lies-confess.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/sweet-lies-confess.md diff --git a/.changeset/sweet-lies-confess.md b/.changeset/sweet-lies-confess.md deleted file mode 100644 index 553600a8..00000000 --- a/.changeset/sweet-lies-confess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sap-ai-sdk/sample-cap': patch ---- - -[New Functionality] Introduce a new sample application based on SAP CAP framework. From e46f829b43aef4351415ef54d068983a2a2f71f0 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 17:29:57 +0200 Subject: [PATCH 25/30] chore: remove db --- sample-cap/db/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sample-cap/db/.gitkeep diff --git a/sample-cap/db/.gitkeep b/sample-cap/db/.gitkeep deleted file mode 100644 index e69de29b..00000000 From cd0d20d49cdb332398f0ac485357fac7c70f5f5f Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 17:30:17 +0200 Subject: [PATCH 26/30] chore: return string --- sample-cap/srv/ai-api/ai-api-service.cds | 3 +-- sample-cap/srv/ai-api/ai-api-service.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sample-cap/srv/ai-api/ai-api-service.cds b/sample-cap/srv/ai-api/ai-api-service.cds index 8a9d0404..3d7726df 100644 --- a/sample-cap/srv/ai-api/ai-api-service.cds +++ b/sample-cap/srv/ai-api/ai-api-service.cds @@ -1,5 +1,4 @@ @path: 'ai-api' service AiApiService { - // Technically, it should return an array of AiDeployment entity if we define it in the model. - action getDeployments() returns array of String; + action getDeployments() returns String; } diff --git a/sample-cap/srv/ai-api/ai-api-service.ts b/sample-cap/srv/ai-api/ai-api-service.ts index 6b2dbdc3..17bc4d23 100644 --- a/sample-cap/srv/ai-api/ai-api-service.ts +++ b/sample-cap/srv/ai-api/ai-api-service.ts @@ -6,6 +6,6 @@ export default class AiApiService { {}, { 'AI-Resource-Group': 'default' } ).execute(); - return response.resources; + return JSON.stringify(response.resources); } } From 6814e8a47aa4841e05229a9ff5fe1518a33ff52c Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 17:32:39 +0200 Subject: [PATCH 27/30] chore: move cap deps to sample-cap --- package.json | 3 +- pnpm-lock.yaml | 83 ++++++++++++++++------------------------- sample-cap/package.json | 10 +++-- 3 files changed, 39 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 018c9fe5..52495fb2 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "sample-code": "pnpm -F=@sap-ai-sdk/sample-code", "sample-cap": "pnpm -F=@sap-ai-sdk/sample-cap", "check:public-api": "pnpm -r check:public-api", - "check:deps": "pnpm -r -F !./tests/smoke-tests -F !./tests/schema-tests exec depcheck --ignores=\"nock,@jest/globals\" --quiet" + "check:deps": "pnpm -r -F !./tests/smoke-tests -F !./tests/schema-tests -F !./sample-cap exec depcheck --ignores=\"nock,@jest/globals\" --quiet" }, "devDependencies": { "@changesets/cli": "^2.27.9", @@ -46,7 +46,6 @@ "@sap-cloud-sdk/http-client": "^3.21.0", "@sap-cloud-sdk/openapi-generator": "^3.21.0", "@sap-cloud-sdk/util": "^3.21.0", - "@cap-js/cds-types": "^0.6", "tsx": "^4.19.1", "@types/jest": "^29.5.13", "@types/jsonwebtoken": "^9.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4904ae44..00410b97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,9 +10,6 @@ importers: .: devDependencies: - '@cap-js/cds-types': - specifier: ^0.6 - version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) '@changesets/cli': specifier: ^2.27.9 version: 2.27.9 @@ -187,6 +184,10 @@ importers: express: specifier: ^4 version: 4.21.0 + devDependencies: + '@cap-js/cds-types': + specifier: ^0.6.5 + version: 0.6.5(@sap/cds@8.2.3(express@4.21.0)) sample-code: dependencies: @@ -262,16 +263,16 @@ importers: version: 0.1.0(@langchain/core@0.3.7(openai@4.61.1(zod@3.23.8))) '@sap-ai-sdk/ai-api': specifier: canary - version: 1.0.1-20240929013103.0 + version: 1.1.1-20241007013116.0 '@sap-ai-sdk/foundation-models': specifier: canary - version: 1.0.1-20240929013103.0 + version: 1.1.1-20241007013116.0 '@sap-ai-sdk/langchain': specifier: canary - version: 1.0.1-20240929013103.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8) + version: 1.1.1-20241007013116.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8) '@sap-ai-sdk/orchestration': specifier: canary - version: 1.0.1-20240929013103.0 + version: 1.1.1-20241007013116.0 '@sap-cloud-sdk/util': specifier: ^3.21.0 version: 3.21.0 @@ -926,10 +927,6 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@langchain/core@0.3.3': - resolution: {integrity: sha512-WAtkmhbdl2T41qzimTzhb3pXCHQxO4onqxzPxgdf3KftQdTwLq0YYBDhozRMZLNAd/+cfH0ymZGaZSsnc9Ogsg==} - engines: {node: '>=18'} - '@langchain/core@0.3.7': resolution: {integrity: sha512-6wsnEtw5GlhmBhoLfw/g8Hrp09BNwQwDLXyuv3GyK+ay4/3H3YuhAphqQLO4HNphuZIZKlW9ihSrqdCMvvbvZQ==} engines: {node: '>=18'} @@ -979,20 +976,20 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sap-ai-sdk/ai-api@1.0.1-20240929013103.0': - resolution: {integrity: sha512-Dc7Q5on38UJxgYApT2b9DhmkYGTY7I8WqxpBXfvp1P4LFSLo+c2T3uRHSeNcd01dl0ymIhC+ecl9z1ltQ+kA5g==} + '@sap-ai-sdk/ai-api@1.1.1-20241007013116.0': + resolution: {integrity: sha512-ISAjwtpVlG6gjmuITU9kS3yPnMUXQk4pU3OWx9A73EN3S+8WDPK/gFYryCyL/7aBOsrjncRQ97L4KKrIUVqMvg==} - '@sap-ai-sdk/core@1.0.1-20240929013103.0': - resolution: {integrity: sha512-SlsqM+wIwr6Ou2HwlzBIXcB1VBj1ChOfxz9ZlyqTyWeMsg5NHfusrdm4UPAEishIqFZp/QHAtbn6jrJ7103pFw==} + '@sap-ai-sdk/core@1.1.1-20241007013116.0': + resolution: {integrity: sha512-CgQ4hAGh3uAx/YksnDKa1FVWKxAA3zGHKZ0AriL3gbRypOsj0fZGI/MhuqXvvHQhuqFfUe2k3pAR6fwY6mV4dQ==} - '@sap-ai-sdk/foundation-models@1.0.1-20240929013103.0': - resolution: {integrity: sha512-g3ERKH6W2I6YIDChoaXFZrFlYkDRI/pYOWJvlP7/G5TT3/cuIyHwZDY+K+ajsOqY32tAfWRWISuLko1sqsU4xw==} + '@sap-ai-sdk/foundation-models@1.1.1-20241007013116.0': + resolution: {integrity: sha512-yG3wWM8CKCMlYHTq5egjIA2OX8V7tBSdz6b9heJfe31gApxG4xl+bMRih15gXzgFYiz7Pjn790Vf6wbUPwle2Q==} - '@sap-ai-sdk/langchain@1.0.1-20240929013103.0': - resolution: {integrity: sha512-xrTNcMWmW0qF4abKs73e44cLjGsY8US0KCIKqtYgEvhVnU28IIlVg0BkS4oEXe/gCCeH00tdbvz9tHf48k10kA==} + '@sap-ai-sdk/langchain@1.1.1-20241007013116.0': + resolution: {integrity: sha512-ZP6HSQsLmSBkHWNMKhQZ6Emevb1966zvbFICxvn4H4OvYUzAPUmqWL3MZtBWpRPQ9VuXYOghhdBi019aIK+ErA==} - '@sap-ai-sdk/orchestration@1.0.1-20240929013103.0': - resolution: {integrity: sha512-n10yK77PlvwXmQiNXnRlM0tKXbbtFST6l0MeKI3JRx1fh7nLI2HcDUYdNuynpyyVVZg+JAL+7vUvGMOGpumOGA==} + '@sap-ai-sdk/orchestration@1.1.1-20241007013116.0': + resolution: {integrity: sha512-o9KJqlH9syQcpPGYyHJ6OHq4lCU/ewyULw/2nZZuiLt6XQ8e6zvXMmv7Y25LrGM+sLN5VO0b70RNaxJjxSiS1w==} '@sap-cloud-sdk/connectivity@3.21.0': resolution: {integrity: sha512-E3WdZ13r+va/DYaj/vLLUEmtj9bKtkxcUiqMWG560X7vFzcUDN0jKtSE8L+RkWs7k3bqsIr01EV+TuGku9mggQ==} @@ -5157,22 +5154,6 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@langchain/core@0.3.3(openai@4.61.1(zod@3.23.8))': - dependencies: - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.14 - langsmith: 0.1.59(openai@4.61.1(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - transitivePeerDependencies: - - openai - '@langchain/core@0.3.7(openai@4.61.1(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 @@ -5259,15 +5240,15 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sap-ai-sdk/ai-api@1.0.1-20240929013103.0': + '@sap-ai-sdk/ai-api@1.1.1-20241007013116.0': dependencies: - '@sap-ai-sdk/core': 1.0.1-20240929013103.0 + '@sap-ai-sdk/core': 1.1.1-20241007013116.0 '@sap-cloud-sdk/connectivity': 3.21.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/core@1.0.1-20240929013103.0': + '@sap-ai-sdk/core@1.1.1-20241007013116.0': dependencies: '@sap-cloud-sdk/connectivity': 3.21.0 '@sap-cloud-sdk/http-client': 3.21.0 @@ -5277,22 +5258,22 @@ snapshots: - debug - supports-color - '@sap-ai-sdk/foundation-models@1.0.1-20240929013103.0': + '@sap-ai-sdk/foundation-models@1.1.1-20241007013116.0': dependencies: - '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 - '@sap-ai-sdk/core': 1.0.1-20240929013103.0 + '@sap-ai-sdk/ai-api': 1.1.1-20241007013116.0 + '@sap-ai-sdk/core': 1.1.1-20241007013116.0 '@sap-cloud-sdk/http-client': 3.21.0 '@sap-cloud-sdk/util': 3.21.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/langchain@1.0.1-20240929013103.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8)': + '@sap-ai-sdk/langchain@1.1.1-20241007013116.0(openai@4.61.1(zod@3.23.8))(zod@3.23.8)': dependencies: - '@langchain/core': 0.3.3(openai@4.61.1(zod@3.23.8)) - '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 - '@sap-ai-sdk/core': 1.0.1-20240929013103.0 - '@sap-ai-sdk/foundation-models': 1.0.1-20240929013103.0 + '@langchain/core': 0.3.7(openai@4.61.1(zod@3.23.8)) + '@sap-ai-sdk/ai-api': 1.1.1-20241007013116.0 + '@sap-ai-sdk/core': 1.1.1-20241007013116.0 + '@sap-ai-sdk/foundation-models': 1.1.1-20241007013116.0 zod-to-json-schema: 3.23.3(zod@3.23.8) transitivePeerDependencies: - debug @@ -5300,10 +5281,10 @@ snapshots: - supports-color - zod - '@sap-ai-sdk/orchestration@1.0.1-20240929013103.0': + '@sap-ai-sdk/orchestration@1.1.1-20241007013116.0': dependencies: - '@sap-ai-sdk/ai-api': 1.0.1-20240929013103.0 - '@sap-ai-sdk/core': 1.0.1-20240929013103.0 + '@sap-ai-sdk/ai-api': 1.1.1-20241007013116.0 + '@sap-ai-sdk/core': 1.1.1-20241007013116.0 '@sap-cloud-sdk/http-client': 3.21.0 '@sap-cloud-sdk/util': 3.21.0 transitivePeerDependencies: diff --git a/sample-cap/package.json b/sample-cap/package.json index cbc05798..9d108323 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -4,14 +4,13 @@ "version": "1.0.0", "description": "Sample CAP application with Cloud SDK for AI.", "repository": "https://github.com/sap/ai-sdk-js", - "license": "UNLICENSED", "private": true, "dependencies": { - "@sap/cds": "^8", - "express": "^4", "@sap-ai-sdk/ai-api": "workspace:^", "@sap-ai-sdk/foundation-models": "workspace:^", - "@sap-ai-sdk/orchestration": "workspace:^" + "@sap-ai-sdk/orchestration": "workspace:^", + "@sap/cds": "^8", + "express": "^4" }, "scripts": { "watch": "cds-tsx watch", @@ -21,5 +20,8 @@ }, "imports": { "#cds-models/*": "./@cds-models/*/index.js" + }, + "devDependencies": { + "@cap-js/cds-types": "^0.6.5" } } From c63aee95e14f78cacefafa9fec67c9a0d24c8d80 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Mon, 7 Oct 2024 17:48:24 +0200 Subject: [PATCH 28/30] chore: remove use less import --- sample-cap/package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/sample-cap/package.json b/sample-cap/package.json index 9d108323..bfdcafe7 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -18,9 +18,6 @@ "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -w --log-level error" }, - "imports": { - "#cds-models/*": "./@cds-models/*/index.js" - }, "devDependencies": { "@cap-js/cds-types": "^0.6.5" } From 81aa1627eb2e27a090b4c0e76e701f34c8dfd52a Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Wed, 9 Oct 2024 11:24:45 +0200 Subject: [PATCH 29/30] fix: move @cap-js/cds-types back to root package.json --- package.json | 1 + pnpm-lock.yaml | 19 +++++++++---------- sample-cap/package.json | 3 --- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 54be53e4..b73ec5fe 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "@types/jsonwebtoken": "^9.0.7", "@types/mock-fs": "^4.13.4", "@types/node": "^20.16.11", + "@cap-js/cds-types": "^0.6.5", "depcheck": "^1.4.7", "eslint": "^9.12.0", "glob": "^11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8902b327..b95d2a96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,9 @@ importers: .: devDependencies: + '@cap-js/cds-types': + specifier: ^0.6.5 + version: 0.6.5(@sap/cds@8.3.1(express@4.21.1)) '@changesets/cli': specifier: ^2.27.9 version: 2.27.9 @@ -184,10 +187,6 @@ importers: express: specifier: ^4 version: 4.21.1 - devDependencies: - '@cap-js/cds-types': - specifier: ^0.6.5 - version: 0.6.5(@sap/cds@8.3.1(express@4.21.1)) sample-code: dependencies: @@ -5416,7 +5415,7 @@ snapshots: eslint: 9.12.0 eslint-config-prettier: 9.1.0(eslint@9.12.0) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0) eslint-plugin-jsdoc: 50.3.1(eslint@9.12.0) eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3) eslint-plugin-regex: 1.10.0(eslint@9.12.0) @@ -6775,20 +6774,20 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 9.12.0 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -6799,7 +6798,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -6810,7 +6809,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.12.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0))(eslint@9.12.0))(eslint@9.12.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 diff --git a/sample-cap/package.json b/sample-cap/package.json index bfdcafe7..0e8f1d11 100644 --- a/sample-cap/package.json +++ b/sample-cap/package.json @@ -17,8 +17,5 @@ "watch:hybrid": "cds-tsx watch --profile hybrid", "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", "lint:fix": "eslint . --fix && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -w --log-level error" - }, - "devDependencies": { - "@cap-js/cds-types": "^0.6.5" } } From 9b1ef64557fc1616e61d70c545c659b009fab6a7 Mon Sep 17 00:00:00 2001 From: Zhongpin Wang Date: Wed, 9 Oct 2024 17:07:54 +0200 Subject: [PATCH 30/30] chore: remove sample cap from deps check --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b73ec5fe..daf8de69 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "sample-code": "pnpm -F=@sap-ai-sdk/sample-code", "sample-cap": "pnpm -F=@sap-ai-sdk/sample-cap", "check:public-api": "pnpm -r check:public-api", - "check:deps": "pnpm -r -F !./tests/smoke-tests -F !./tests/schema-tests -F !./sample-cap exec depcheck --ignores=\"nock,@jest/globals\" --quiet" + "check:deps": "pnpm -r -F !./tests/smoke-tests -F !./tests/schema-tests exec depcheck --ignores=\"nock,@jest/globals\" --quiet" }, "devDependencies": { "@changesets/cli": "^2.27.9",