diff --git a/.changeset/big-mayflies-begin.md b/.changeset/big-mayflies-begin.md index fae05a988..58eee6ff6 100644 --- a/.changeset/big-mayflies-begin.md +++ b/.changeset/big-mayflies-begin.md @@ -2,4 +2,5 @@ '@sap-ai-sdk/orchestration': minor --- -Update orchestration to 2501a release. +[Compatibility Note] Update AI API to the 2501a release. +As part of this change, the `modelsGet` method of `ScenarioAPI` has been renamed to `scenarioQueryModels`. diff --git a/.changeset/help-sap-com.md b/.changeset/help-sap-com.md new file mode 100644 index 000000000..11e1833c1 --- /dev/null +++ b/.changeset/help-sap-com.md @@ -0,0 +1,5 @@ +--- +'@sap-ai-sdk/orchestration': minor +--- + +[New Functionality] Support using `help.sap.com` as data repository type in the grounding module. diff --git a/.changeset/tender-numbers-sin.md b/.changeset/tender-numbers-sin.md new file mode 100644 index 000000000..56ab390ca --- /dev/null +++ b/.changeset/tender-numbers-sin.md @@ -0,0 +1,6 @@ +--- +'@sap-ai-sdk/langchain': minor +'@sap-ai-sdk/sample-code': minor +--- + +[Fixed Issue] Fixed the internal mapping of LangChain to Azure OpenAI and vice versa. diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 60470aa4e..f6084b331 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -9,7 +9,7 @@ inputs: default: 'https://registry.npmjs.org' pnpm-version: description: 'PNPM version' - default: '9' + default: '10' pnpm-install-args: description: 'Arguments to pass to pnpm install' default: '--frozen-lockfile' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f86ad0798..3cef7b7f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,7 +54,7 @@ jobs: steps: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.2.0 + uses: dependabot/fetch-metadata@v2.3.0 with: github-token: '${{ secrets.GITHUB_TOKEN }}' - name: Approve a PR diff --git a/.github/workflows/spec-update.yaml b/.github/workflows/spec-update.yaml index f17f9b472..f27699253 100644 --- a/.github/workflows/spec-update.yaml +++ b/.github/workflows/spec-update.yaml @@ -33,6 +33,7 @@ jobs: outputs: spec_diff: ${{ steps.spec_diff.outputs.spec_diff }} branch: ${{ steps.push.outputs.branch }} + pr_url: ${{ steps.create-pr.outputs.pr_url }} compilation_result: ${{ steps.compile.outputs.compilation_result }} test_result: ${{ steps.compile.outputs.test_result }} env: @@ -41,9 +42,9 @@ jobs: REF: ${{ github.event.inputs.file-ref }} CREATE_PR: ${{ github.event.inputs.create-pr }} steps: - - name: "Checkout repository" - uses: actions/checkout@v4 + - uses: sap/ai-sdk-js/.github/actions/setup@main with: + node-version: 20 token: ${{ secrets.GITHUB_TOKEN }} - name: "Checkout or Create Branch" @@ -81,23 +82,23 @@ jobs: - name: "Exit if there are no changes" id: spec_diff + # Before checking for changed files, run the linter as that also formats spec files run: | - if [[ `git status --porcelain` ]]; then + pnpm lint:fix + if [[ -n "$(git status --porcelain)" ]]; then + echo "Changes detected in the specification file." + git status echo "spec_diff=true" >> "$GITHUB_OUTPUT" else + echo "No changes detected in the specification file, skipping rest of the job." + git status echo "spec_diff=false" >> "$GITHUB_OUTPUT" fi - - uses: sap/ai-sdk-js/.github/actions/setup@main - if: steps.spec_diff.outputs.spec_diff == 'true' - with: - node-version: 20 - - name: "Generate" id: generate if: steps.spec_diff.outputs.spec_diff == 'true' run: | - pnpm install pnpm generate - name: "Compile and Test" @@ -124,11 +125,13 @@ jobs: run: | git config --global user.email "cloudsdk@sap.com" git config --global user.name "SAP Cloud SDK Bot" - git add . + git add --all + git status git commit -m "Update $CHOICE based on $REF" git push --set-upstream origin ${{ steps.branch.outputs.branch }} - name: "Create PR" + id: create-pr if: ${{ env.CREATE_PR == 'true' && steps.spec_diff.outputs.spec_diff == 'true'}} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -139,7 +142,7 @@ jobs: exit 0 fi - gh pr create --base main --head $BRANCH --title "feat: [DevOps] Update $CHOICE Specification" --body " + PR_URL=$(gh pr create --base main --head $BRANCH --title "feat: Update $CHOICE specification" --body " ## Context Update $CHOICE specification file based on $REF. @@ -147,8 +150,8 @@ jobs: This PR was created automatically by the [spec-update workflow](https://github.com/SAP/ai-sdk-js/actions/workflows/spec-update.yaml). You can commit on top of this branch, but as long as this PR is open the action can't be re-run. - - Compilation outcome: ${{ steps.compile.output.compilation_result }} - - Test run outcome: ${{ steps.compile.output.test_result }} + - Compilation outcome: ${{ steps.compile.outputs.compilation_result }} + - Test run outcome: ${{ steps.compile.outputs.test_result }} Before merging, make sure to update tests and release notes, if necessary. @@ -156,14 +159,26 @@ jobs: - [ ] Unit / type tests cover new classes - [ ] Release notes updated - " + ") && echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT" - - name: "Print Summary" + - name: Generate Job Summary if: ${{ always() }} + env: + BRANCH: ${{ steps.branch.outputs.branch }} + PR_URL: ${{ steps.create-pr.outputs.pr_url }} run: | - echo "File download outcome: ${{ steps.download.outcome }}" - echo "Spec file contained changes: ${{ steps.spec_diff.outputs.spec_diff }}" - echo "Client generation outcome: ${{ steps.generate.outcome }}" - echo "Client compilation outcome: ${{ steps.compile.output.compilation_result }}" - echo "Client test outcome: ${{ steps.compile.output.test_result }}" - echo "Branch creation: ${{ steps.push.outcome }}" + DIFF_URL="https://github.com/SAP/ai-sdk-js/compare/main...$BRANCH" + echo "## Workflow Execution Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Step | Status |" >> $GITHUB_STEP_SUMMARY + echo "|------|--------|" >> $GITHUB_STEP_SUMMARY + echo "| File Download | ${{ steps.download.outcome == 'success' && '✅' || '❌' }} ${{ steps.download.outcome }}" >> $GITHUB_STEP_SUMMARY + echo "| Spec File Changes | ${{ steps.spec_diff.outputs.spec_diff == 'true' && '🔄 Changes Detected' || '⏚ī¸ No Changes' }}" >> $GITHUB_STEP_SUMMARY + + if ${{ steps.spec_diff.outputs.spec_diff == 'true' }}; then + echo "| Client Generation | ${{ steps.generate.outcome == 'success' && '✅' || '❌' }} ${{ steps.generate.outcome }}" >> $GITHUB_STEP_SUMMARY + echo "| Client Compilation | ${{ steps.compile.outputs.compilation_result == 'success' && '✅' || '❌' }} ${{ steps.compile.outputs.compilation_result }}" >> $GITHUB_STEP_SUMMARY + echo "| Client Testing | ${{ steps.compile.outputs.test_result == 'success' && '✅' || steps.compile.outputs.test_result == 'skipped' && '⏊' || '❌' }} ${{ steps.compile.outputs.test_result }}" >> $GITHUB_STEP_SUMMARY + echo "| Branch Creation | ${{ steps.push.outcome == 'success' && '✅ [Branch Link]($DIFF_URL)' || '❌ failure' }}" >> $GITHUB_STEP_SUMMARY + echo "| Pull Request Creation | ${{ env.CREATE_PR == 'false' && '⏊ skipped' || '' }}${{ env.CREATE_PR == 'true' && steps.push.outcome == 'success' && '✅ [PR Link]($PR_URL)' || '' }}" >> $GITHUB_STEP_SUMMARY + fi \ No newline at end of file diff --git a/package.json b/package.json index 89348a20b..867f0d5c2 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "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.11", + "@changesets/cli": "^2.27.12", "@jest/globals": "^29.5.12", "@sap-ai-sdk/ai-api": "workspace:^", "@sap-ai-sdk/core": "workspace:^", @@ -48,16 +48,16 @@ "@sap-cloud-sdk/openapi-generator": "^3.25.0", "@sap-cloud-sdk/util": "^3.25.0", "@types/jest": "^29.5.14", - "@types/jsonwebtoken": "^9.0.7", + "@types/jsonwebtoken": "^9.0.8", "@types/mock-fs": "^4.13.4", - "@types/node": "^20.17.14", + "@types/node": "^20.17.16", "depcheck": "^1.4.7", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "glob": "^11.0.1", "jest": "^30.0.0-alpha.6", "jsonwebtoken": "^9.0.2", "mock-fs": "^5.4.1", - "nock": "^13.5.6", + "nock": "^14.0.0", "prettier": "^3.4.2", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", diff --git a/packages/ai-api/src/client/AI_CORE_API/file-api.ts b/packages/ai-api/src/client/AI_CORE_API/file-api.ts index 9e73dd4b7..09eb8f066 100644 --- a/packages/ai-api/src/client/AI_CORE_API/file-api.ts +++ b/packages/ai-api/src/client/AI_CORE_API/file-api.ts @@ -56,7 +56,7 @@ export const FileApi = { */ fileUpload: ( path: string, - body: string | undefined, + body: any | undefined, queryParameters?: { overwrite?: boolean }, headerParameters?: { 'AI-Resource-Group'?: string } ) => diff --git a/packages/ai-api/src/client/AI_CORE_API/scenario-api.ts b/packages/ai-api/src/client/AI_CORE_API/scenario-api.ts index f158de5f1..15c360bc3 100644 --- a/packages/ai-api/src/client/AI_CORE_API/scenario-api.ts +++ b/packages/ai-api/src/client/AI_CORE_API/scenario-api.ts @@ -79,7 +79,7 @@ export const ScenarioApi = { * @param headerParameters - Object containing the following keys: AI-Resource-Group. * @returns The request builder, use the `execute()` method to trigger the request. */ - modelsGet: ( + scenarioQueryModels: ( scenarioId: string, headerParameters: { 'AI-Resource-Group': string } ) => diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-base-data.ts b/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-base-data.ts index 4405f4d8f..18c651217 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-base-data.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-base-data.ts @@ -19,4 +19,12 @@ export type AiModelBaseData = { */ description: string; versions: AiModelVersionList; + /** + * Display name of the model + */ + displayName?: string; + /** + * Access type of the model + */ + accessType?: string; } & Record; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-version.ts b/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-version.ts index 1ede49f13..5122af0c9 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-version.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/ai-model-version.ts @@ -5,7 +5,7 @@ */ /** - * Model version information including whether it is latest version + * Model version information including whether it is latest version, its deprecation status and optional retirement date */ export type AiModelVersion = { /** @@ -16,4 +16,24 @@ export type AiModelVersion = { * Displays whether it is the latest version offered for the model */ isLatest: boolean; + /** + * Deprecation status of model + */ + deprecated: boolean; + /** + * Retirement date of model in ISO 8601 timestamp + */ + retirementDate?: string; + /** + * Context length of the model + */ + contextLength?: number; + /** + * List of input types supported by the model + */ + inputTypes?: string[]; + /** + * List of capabilities supported by the model + */ + capabilities?: string[]; } & Record; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-label.ts b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-label.ts new file mode 100644 index 000000000..2b822ba76 --- /dev/null +++ b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-label.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 SAP SE or an SAP affiliate company. All rights reserved. + * + * This is a generated file powered by the SAP Cloud SDK for JavaScript. + */ + +/** + * Representation of the 'BckndGenericSecretLabel' schema. + */ +export type BckndGenericSecretLabel = { + /** + * @example "ext.ai.sap.com/my-label" + * Max Length: 63. + * Pattern: "^ext.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,48}$". + */ + key: string; + /** + * Max Length: 5000. + */ + value: string; +} & Record; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-labels.ts b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-labels.ts new file mode 100644 index 000000000..75bc827f4 --- /dev/null +++ b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-labels.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2025 SAP SE or an SAP affiliate company. All rights reserved. + * + * This is a generated file powered by the SAP Cloud SDK for JavaScript. + */ +import type { BckndGenericSecretLabel } from './bcknd-generic-secret-label.js'; +/** + * Arbitrary labels as meta information + */ +export type BckndGenericSecretLabels = BckndGenericSecretLabel[]; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-post-body.ts b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-post-body.ts index ce68826db..9765a5182 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-post-body.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/bcknd-generic-secret-post-body.ts @@ -4,6 +4,7 @@ * This is a generated file powered by the SAP Cloud SDK for JavaScript. */ import type { BckndGenericSecretData } from './bcknd-generic-secret-data.js'; +import type { BckndGenericSecretLabels } from './bcknd-generic-secret-labels.js'; /** * Representation of the 'BckndGenericSecretPostBody' schema. */ @@ -16,4 +17,5 @@ export type BckndGenericSecretPostBody = { */ name: string; data: BckndGenericSecretData; + labels?: BckndGenericSecretLabels; } & Record; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/index.ts b/packages/ai-api/src/client/AI_CORE_API/schema/index.ts index 9068efd6a..bec7f0c3f 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/index.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/index.ts @@ -56,9 +56,6 @@ export * from './rt-atimestamp.js'; export * from './rt-amessage.js'; export * from './rta-error-response.js'; export * from './rta-error.js'; -export * from './d-set-url.js'; -export * from './d-set-error.js'; -export * from './d-set-file-creation-response.js'; export * from './ai-scenario.js'; export * from './ai-scenario-label-list.js'; export * from './ai-label-list.js'; @@ -173,6 +170,32 @@ export * from './ai-creation-response-message.js'; export * from './ai-url.js'; export * from './ai-api-error-with-id.js'; export * from './ai-api-error.js'; +export * from './trck-get-metric-resource.js'; +export * from './trck-metric-resource.js'; +export * from './trck-get-metric-resource-list.js'; +export * from './trck-delete-metrics-response.js'; +export * from './trck-execution-id.js'; +export * from './trck-timestamp.js'; +export * from './trck-get-metric-list.js'; +export * from './trck-metric-list.js'; +export * from './trck-get-metric.js'; +export * from './trck-metric.js'; +export * from './trck-metric-name.js'; +export * from './trck-metric-value.js'; +export * from './trckmetric-selector-permissible-values.js'; +export * from './trck-label-list.js'; +export * from './trck-label.js'; +export * from './trck-tag-list.js'; +export * from './trck-tag.js'; +export * from './trck-custom-info-object-list.js'; +export * from './trck-custom-info-object.js'; +export * from './trck-custom-info-object-data.js'; +export * from './trck-mlapi-execution-id.js'; +export * from './trck-generic-name.js'; +export * from './trck-label-name.js'; +export * from './trck-api-error.js'; +export * from './trck-details-error-response.js'; +export * from './trck-string-array.js'; export * from './bcknd-id.js'; export * from './bcknd-message.js'; export * from './bcknd-name.js'; @@ -220,6 +243,8 @@ export * from './bcknd-generic-secret-patch-body.js'; export * from './bcknd-generic-secret-data-response.js'; export * from './bcknd-generic-secret-details.js'; export * from './bcknd-list-generic-secrets-response.js'; +export * from './bcknd-generic-secret-labels.js'; +export * from './bcknd-generic-secret-label.js'; export * from './bcknd-argo-cd-repository-data.js'; export * from './bcknd-argo-cd-repository-credentials.js'; export * from './bcknd-argo-cd-repository-data-response.js'; @@ -269,38 +294,6 @@ export * from './bcknd-resource-get-response.js'; export * from './bcknd-resource-get-resource-plans.js'; export * from './bcknd-error-response.js'; export * from './bcknd-error.js'; -export * from './trck-get-metric-resource.js'; -export * from './trck-metric-resource.js'; -export * from './trck-get-metric-resource-list.js'; -export * from './trck-delete-metrics-response.js'; -export * from './trck-execution-id.js'; -export * from './trck-timestamp.js'; -export * from './trck-get-metric-list.js'; -export * from './trck-metric-list.js'; -export * from './trck-get-metric.js'; -export * from './trck-metric.js'; -export * from './trck-metric-name.js'; -export * from './trck-metric-value.js'; -export * from './trckmetric-selector-permissible-values.js'; -export * from './trck-label-list.js'; -export * from './trck-label.js'; -export * from './trck-tag-list.js'; -export * from './trck-tag.js'; -export * from './trck-custom-info-object-list.js'; -export * from './trck-custom-info-object.js'; -export * from './trck-custom-info-object-data.js'; -export * from './trck-mlapi-execution-id.js'; -export * from './trck-generic-name.js'; -export * from './trck-label-name.js'; -export * from './trck-api-error.js'; -export * from './trck-details-error-response.js'; -export * from './trck-string-array.js'; -export * from './meta-capabilities.js'; -export * from './meta-extensions.js'; -export * from './meta-ai-api.js'; -export * from './meta-version.js'; -export * from './meta-api-version.js'; -export * from './meta-api-error.js'; export * from './kpi-column-name.js'; export * from './kpi-array-of-column-names.js'; export * from './kpi-aggregation-attribute.js'; @@ -310,3 +303,12 @@ export * from './kpi-result-row-item.js'; export * from './kpi-result-row-list.js'; export * from './kpi-result-set.js'; export * from './kpi-api-error.js'; +export * from './d-set-url.js'; +export * from './d-set-error.js'; +export * from './d-set-file-creation-response.js'; +export * from './meta-capabilities.js'; +export * from './meta-extensions.js'; +export * from './meta-ai-api.js'; +export * from './meta-version.js'; +export * from './meta-api-version.js'; +export * from './meta-api-error.js'; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-base-data.ts b/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-base-data.ts index 124d0c23d..bdcbcda5c 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-base-data.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-base-data.ts @@ -19,4 +19,12 @@ export type RTAModelBaseData = { */ description: string; versions: RTAModelVersionList; + /** + * Display name of the model + */ + displayName?: string; + /** + * Access type of the model + */ + accessType?: string; } & Record; diff --git a/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-version.ts b/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-version.ts index e97ad68ac..450ecc3b3 100644 --- a/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-version.ts +++ b/packages/ai-api/src/client/AI_CORE_API/schema/rta-model-version.ts @@ -23,5 +23,17 @@ export type RTAModelVersion = { /** * Retirement date of model in ISO 8601 timestamp */ - retirementDate: string; + retirementDate?: string; + /** + * Context length of the model + */ + contextLength?: number; + /** + * List of input types supported by the model + */ + inputTypes?: string[]; + /** + * List of capabilities supported by the model + */ + capabilities?: string[]; } & Record; diff --git a/packages/ai-api/src/spec/AI_CORE_API.yaml b/packages/ai-api/src/spec/AI_CORE_API.yaml index 77b7b8294..f6a14b775 100644 --- a/packages/ai-api/src/spec/AI_CORE_API.yaml +++ b/packages/ai-api/src/spec/AI_CORE_API.yaml @@ -5,11 +5,11 @@ info: "Provides tools to manage your scenarios and workflows in SAP AI Core. Execute pipelines as a batch job, for example to pre-process or train your models, or perform batch inference. Serve inference requests of trained models. Deploy - Đ° trained machine learning model as a web service to serve inference requests + a trained machine learning model as a web service to serve inference requests with high performance. Register your own Docker registry, synchronize your AI content from your own git repository, and register your own object store for training data and trained models.\n" - version: 2.34.0 + version: 2.37.0 x-sap-shortText: Create and manage AI scenarios, trainings, deployments, and artifacts in SAP AI Core. @@ -28,7 +28,7 @@ servers: - prod-us21.eastus.azure - prod-eu30.europe-west3.gcp - prod-us30.us-central1.gcp - default: prod.eu-central-1 + default: prod.eu-central-1.aws externalDocs: description: Documentation for SAP AI Core url: https://help.sap.com/docs/AI_CORE?version=CLOUD @@ -811,7 +811,7 @@ paths: - Scenario summary: Get information about all models available in LLM global scenario description: Retrieve information about all models available in LLM global scenario - operationId: models.get + operationId: scenario.query_models responses: '200': description: @@ -1127,8 +1127,7 @@ paths: description: Body of the file upload request content: '*/*': - schema: - type: string + schema: {} responses: '201': $ref: '#/components/responses/DSetFileCreated' @@ -2420,10 +2419,10 @@ paths: $ref: '#/components/schemas/BckndDeploymentResourceQuotaResponse' '400': $ref: '#/components/responses/BckndBadRequest' - default: - $ref: '#/components/responses/BckndCommonError' '404': $ref: '#/components/responses/BckndNotFound' + default: + $ref: '#/components/responses/BckndCommonError' components: securitySchemes: Oauth2: @@ -2642,6 +2641,12 @@ components: description: Description of the model and its capabilities versions: $ref: '#/components/schemas/RTAModelVersionList' + displayName: + type: string + description: Display name of the model + accessType: + type: string + description: Access type of the model RTAModelVersionList: type: array description: List of model versions that the model object has @@ -2656,7 +2661,6 @@ components: - name - isLatest - deprecated - - retirementDate properties: name: type: string @@ -2670,6 +2674,19 @@ components: retirementDate: type: string description: Retirement date of model in ISO 8601 timestamp + contextLength: + type: integer + description: Context length of the model + inputTypes: + type: array + description: List of input types supported by the model + items: + type: string + capabilities: + type: array + description: List of capabilities supported by the model + items: + type: string RTAArtifact: description: Entity having labels type: object @@ -3014,65 +3031,6 @@ components: details: description: Optional details of the error message type: object - DSetUrl: - type: string - format: url - example: https://download.example.com/test/file.bin - DSetError: - description: Error Response - type: object - properties: - code: - type: string - minLength: 1 - message: - type: string - minLength: 1 - target: - type: string - minLength: 1 - requestId: - type: string - details: - type: array - uniqueItems: true - minItems: 0 - items: - required: - - code - - message - properties: - code: - type: string - minLength: 1 - message: - type: string - minLength: 1 - required: - - code - - message - x-examples: - example-1: - code: '03021655' - message: Bad request encountered. Please try again with possible-solution-here. - target: /url/path - requestId: 9832bf934f3743v3948v3 - details: - - code: '01041211' - message: Optional nested error message. - DSetFileCreationResponse: - description: Response for successful file creation - type: object - required: - - message - - url - properties: - message: - type: string - description: File creation response message - example: File creation acknowledged - url: - $ref: '#/components/schemas/DSetUrl' AiScenario: type: object description: @@ -3199,6 +3157,12 @@ components: description: Description of the model and its capabilities versions: $ref: '#/components/schemas/AiModelVersionList' + displayName: + type: string + description: Display name of the model + accessType: + type: string + description: Access type of the model AiModelVersionList: type: array description: List of model versions that the model object has @@ -3206,10 +3170,13 @@ components: $ref: '#/components/schemas/AiModelVersion' AiModelVersion: type: object - description: Model version information including whether it is latest version + description: + Model version information including whether it is latest version, + its deprecation status and optional retirement date required: - name - isLatest + - deprecated properties: name: type: string @@ -3217,6 +3184,25 @@ components: isLatest: type: boolean description: Displays whether it is the latest version offered for the model + deprecated: + type: boolean + description: Deprecation status of model + retirementDate: + type: string + description: Retirement date of model in ISO 8601 timestamp + contextLength: + type: integer + description: Context length of the model + inputTypes: + type: array + description: List of input types supported by the model + items: + type: string + capabilities: + type: array + description: List of capabilities supported by the model + items: + type: string AiVersion: type: object required: @@ -4496,26 +4482,42 @@ components: details: description: Optional details of the error message type: object - BckndId: - type: string - pattern: ^[\w.-]{4,64}$ - example: aa97b177-9383-4934-8543-0f91a7a0283a - description: Generic ID - BckndMessage: - type: string - description: Message - BckndName: - type: string - description: Name - BckndCreationResponseMessage: - type: string - description: Message - example: Created - BckndUrl: - type: string - format: url - BckndResourceGroupList: + TrckGetMetricResource: + description: + Collection of various metrics/tags/labels associated against some + execution/deployment + type: object + properties: + executionId: + $ref: '#/components/schemas/TrckExecutionId' + metrics: + $ref: '#/components/schemas/TrckGetMetricList' + tags: + $ref: '#/components/schemas/TrckTagList' + customInfo: + $ref: '#/components/schemas/TrckCustomInfoObjectList' + required: + - executionId + TrckMetricResource: + description: + Collection of various metrics/tags/labels associated against some + execution/deployment + required: + - executionId + type: object + properties: + executionId: + $ref: '#/components/schemas/TrckExecutionId' + metrics: + $ref: '#/components/schemas/TrckMetricList' + tags: + $ref: '#/components/schemas/TrckTagList' + customInfo: + $ref: '#/components/schemas/TrckCustomInfoObjectList' + TrckGetMetricResourceList: type: object + required: + - resources properties: count: type: integer @@ -4523,209 +4525,488 @@ components: resources: type: array items: - $ref: '#/components/schemas/BckndResourceGroup' - required: - - count - - resources - BckndResourceGroupBase: + $ref: '#/components/schemas/TrckGetMetricResource' + TrckDeleteMetricsResponse: type: object properties: - resourceGroupId: - description: resource group id - type: string - tenantId: - description: tenant id - type: string - zoneId: - description: zone id + id: + $ref: '#/components/schemas/TrckExecutionId' + message: type: string - BckndResourceGroup: + example: Metric Resource was successfully deleted + TrckExecutionId: + type: string + example: aa97b177-9383-4934-8543-0f91b7a0283a + oneOf: + - $ref: '#/components/schemas/TrckMlapiExecutionId' + description: ID of the deployment/execution + TrckTimestamp: + type: string + description: Time when the metric was created or logged in RFC3339 format + format: date-time + TrckGetMetricList: + description: Array of Metric items + type: array + items: + $ref: '#/components/schemas/TrckGetMetric' + TrckMetricList: + description: Array of Metric items + type: array + items: + $ref: '#/components/schemas/TrckMetric' + TrckGetMetric: + description: + Key-value metrics, where the value is numeric. Metric can also + have optional step and label fields. type: object + required: + - name + - value + - timestamp properties: - resourceGroupId: - description: resource group id - type: string - tenantId: - description: tenant id - type: string - zoneId: - description: zone id - type: string - createdAt: - description: Timestamp of resource group creation - type: string - format: date-time + name: + $ref: '#/components/schemas/TrckMetricName' + value: + $ref: '#/components/schemas/TrckMetricValue' + timestamp: + $ref: '#/components/schemas/TrckTimestamp' + step: + description: + step is an optional integer that represents any measurement + of training progress (number of training iterations, number of epochs, + and so on) for the metric + type: integer + minimum: 0 + example: 2 labels: - $ref: '#/components/schemas/BckndResourceGroupLabels' - status: - description: aggregated status of the onboarding process - type: string - enum: - - PROVISIONED - - ERROR - - PROVISIONING - statusMessage: - description: status message - type: string + $ref: '#/components/schemas/TrckLabelList' + TrckMetric: + description: + Key-value metrics, where the value is numeric. Metric can also + have optional step and label fields. required: - - status - - createdAt - - resourceGroupId - BckndInternalResourceGroup: + - name + - value type: object properties: - resourceGroupId: - description: resource group id - type: string - tenantId: - description: tenant id - type: string - zoneId: - description: zone id - type: string - createdAt: - description: Timestamp of resource group creation - type: string - format: date-time - labels: - $ref: '#/components/schemas/BckndInternalResourceGroupLabels' - status: - description: aggregated status of the onboarding process - type: string - enum: - - PROVISIONED - - ERROR - - PROVISIONING - statusMessage: - description: status message - type: string - annotations: - $ref: '#/components/schemas/BckndInternalResourceGroupAnnotations' - required: - - status - - createdAt - - resourceGroupId - BckndResourceGroupsPostRequest: - type: object - properties: - resourceGroupId: - description: resource group id - type: string - pattern: ^[a-zA-Z0-9][a-zA-Z0-9.-]{1,251}[a-zA-Z0-9]$ - minLength: 3 - maxLength: 253 + name: + $ref: '#/components/schemas/TrckMetricName' + value: + $ref: '#/components/schemas/TrckMetricValue' + timestamp: + $ref: '#/components/schemas/TrckTimestamp' + step: + description: + step is an optional integer that represents any measurement + of training progress (number of training iterations, number of epochs, + and so on) for the metric + type: integer + minimum: 0 + example: 2 labels: - $ref: '#/components/schemas/BckndResourceGroupLabels' - BckndResourceGroupLabels: + $ref: '#/components/schemas/TrckLabelList' + TrckMetricName: + pattern: '[\w-]{1,64}' + type: string + maxLength: 256 + description: Name of the metric + example: Error Rate + TrckMetricValue: + type: number + description: Numeric Value of the metric + example: 0.98 + TrckmetricSelectorPermissibleValues: + description: + Permissible value for $select could be either * or one or many + of the values from metrics, tags, custominfo type: array - description: Arbitrary labels as meta information items: - $ref: '#/components/schemas/BckndResourceGroupLabel' - BckndResourceGroupLabel: - type: object + type: string + enum: + - metrics + - tags + - customInfo + - '*' + TrckLabelList: + description: a list of name-value object pairs associated with some metric. + type: array + items: + $ref: '#/components/schemas/TrckLabel' + example: + - name: group + value: tree-82 + - name: metrics.ai.sap.com/Artifact.name + value: sk_learn_rf_classifier_model + TrckLabel: + description: a classifying phrase/name applied to a metric required: - - key + - name - value + type: object properties: - key: - type: string - pattern: ^ext.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,48}$ - maxLength: 63 - example: ext.ai.sap.com/my-label + name: + $ref: '#/components/schemas/TrckLabelName' value: + description: Metric Label Value + maxLength: 256 + minLength: 1 type: string - maxLength: 5000 - BckndInternalResourceGroupLabels: + example: sk_learn_random_forest_model + example: + name: group + value: tree-82 + TrckTagList: + description: + a list of name-value object pairs associated with the execution/deployment. + Tags are queryable. type: array - description: Arbitrary labels as meta information items: - $ref: '#/components/schemas/BckndInternalResourceGroupLabel' - BckndInternalResourceGroupLabel: - type: object + $ref: '#/components/schemas/TrckTag' + TrckTag: + description: + A dictionary of name-value pairs to support segregation at execution + level. required: - - key + - name - value + type: object properties: - key: - type: string - pattern: ^internal.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,43}$ - maxLength: 63 - example: internal.ai.sap.com/my-label + name: + oneOf: + - $ref: '#/components/schemas/TrckGenericName' value: + description: tag value + maxLength: 256 + minLength: 1 type: string - maxLength: 5000 - BckndInternalResourceGroupAnnotations: + example: RFC-1 + example: + name: Artifact Group + value: RFC-1 + TrckCustomInfoObjectList: + description: '' type: array - description: Arbitrary annotations as meta information items: - $ref: '#/components/schemas/BckndInternalResourceGroupAnnotation' - BckndInternalResourceGroupAnnotation: - type: object + $ref: '#/components/schemas/TrckCustomInfoObject' + TrckCustomInfoObject: + description: + large object which provides rendering/semantic information regarding + certain metric for consuming application or can be complex metrics in JSON + format required: - - key + - name - value - properties: - key: - type: string - pattern: ^internal.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,43}$ - maxLength: 63 - example: internal.ai.sap.com/my-annotation - value: - type: string - maxLength: 5000 - BckndResourceGroupDeletionResponse: type: object properties: - id: - $ref: '#/components/schemas/BckndId' - message: - $ref: '#/components/schemas/BckndResourceGroupDeletionResponseMessage' + name: + oneOf: + - $ref: '#/components/schemas/TrckGenericName' + value: + $ref: '#/components/schemas/TrckCustomInfoObjectData' + example: + name: Confusion Matrix + value: + "[{'Predicted': 'False', 'Actual': 'False','value': 34},{'Predicted': + 'False','Actual': 'True', 'value': 124}, {'Predicted': 'True','Actual': + 'False','value': 165},{ 'Predicted': 'True','Actual': 'True','value': + 36}]" + TrckCustomInfoObjectData: + description: Message + minLength: 1 + type: string + example: + "[{'Predicted': 'False',\t'Actual': 'False','value': 34},{'Predicted': + 'False','Actual': 'True',\t'value': 124}, {'Predicted': 'True','Actual': 'False','value': + 165},{\t'Predicted': 'True','Actual': 'True','value': 36}]" + TrckMlapiExecutionId: + description: Generic ID + pattern: ^[\w.-]{4,64}$ + type: string + example: aa97b177-9383-4934-8543-0f91b7a0283a + TrckGenericName: + description: + Generic name which can belong to a tag,label,metric or customInfo + Object + maxLength: 256 + minLength: 1 + type: string + example: sample name + TrckLabelName: + description: + Label name to label one or more metrics. "metrics.ai.sap.com/Artifact.name" + is a reserved label to associate an artifact with the metrics + maxLength: 256 + minLength: 1 + type: string + example: metrics.ai.sap.com/Artifact.name + TrckApiError: required: - - id + - code - message - BckndResourceGroupDeletionResponseMessage: - type: string - description: Message - example: Resource Group deletion scheduled - BckndResourceGroupPatchRequest: - type: object - properties: - labels: - $ref: '#/components/schemas/BckndResourceGroupLabels' - BckndEvent: type: object properties: - tenantId: - description: tenant id - type: string - action: + code: + description: Descriptive error code (not http status code). type: string - enum: - - PROVISION - - DEPROVISION - state: + message: + description: plaintext error description type: string - enum: - - SUCCESSFUL - - FAILED - - PENDING - description: - description: describes the event state + requestId: + description: id of individual request type: string - createdAt: + target: + description: url that has been called type: string - format: date-time - example: '2017-09-28T08:56:23.275Z' - BckndTenant: + details: + type: array + items: + $ref: '#/components/schemas/TrckDetailsErrorResponse' + TrckDetailsErrorResponse: type: object properties: - tenantId: - description: tenant id + code: + description: Descriptive error code (not http status code) type: string - zoneId: - description: zone id + message: + description: Plaintext error description type: string - realSubaccountId: + TrckStringArray: + type: array + example: + - value1 + - value2 + items: + type: string + BckndId: + type: string + pattern: ^[\w.-]{4,64}$ + example: aa97b177-9383-4934-8543-0f91a7a0283a + description: Generic ID + BckndMessage: + type: string + description: Message + BckndName: + type: string + description: Name + BckndCreationResponseMessage: + type: string + description: Message + example: Created + BckndUrl: + type: string + format: url + BckndResourceGroupList: + type: object + properties: + count: + type: integer + description: Number of the resource instances in the list + resources: + type: array + items: + $ref: '#/components/schemas/BckndResourceGroup' + required: + - count + - resources + BckndResourceGroupBase: + type: object + properties: + resourceGroupId: + description: resource group id + type: string + tenantId: + description: tenant id + type: string + zoneId: + description: zone id + type: string + BckndResourceGroup: + type: object + properties: + resourceGroupId: + description: resource group id + type: string + tenantId: + description: tenant id + type: string + zoneId: + description: zone id + type: string + createdAt: + description: Timestamp of resource group creation + type: string + format: date-time + labels: + $ref: '#/components/schemas/BckndResourceGroupLabels' + status: + description: aggregated status of the onboarding process + type: string + enum: + - PROVISIONED + - ERROR + - PROVISIONING + statusMessage: + description: status message + type: string + required: + - status + - createdAt + - resourceGroupId + BckndInternalResourceGroup: + type: object + properties: + resourceGroupId: + description: resource group id + type: string + tenantId: + description: tenant id + type: string + zoneId: + description: zone id + type: string + createdAt: + description: Timestamp of resource group creation + type: string + format: date-time + labels: + $ref: '#/components/schemas/BckndInternalResourceGroupLabels' + status: + description: aggregated status of the onboarding process + type: string + enum: + - PROVISIONED + - ERROR + - PROVISIONING + statusMessage: + description: status message + type: string + annotations: + $ref: '#/components/schemas/BckndInternalResourceGroupAnnotations' + required: + - status + - createdAt + - resourceGroupId + BckndResourceGroupsPostRequest: + type: object + properties: + resourceGroupId: + description: resource group id + type: string + pattern: ^[a-zA-Z0-9][a-zA-Z0-9.-]{1,251}[a-zA-Z0-9]$ + minLength: 3 + maxLength: 253 + labels: + $ref: '#/components/schemas/BckndResourceGroupLabels' + BckndResourceGroupLabels: + type: array + description: Arbitrary labels as meta information + items: + $ref: '#/components/schemas/BckndResourceGroupLabel' + BckndResourceGroupLabel: + type: object + required: + - key + - value + properties: + key: + type: string + pattern: ^ext.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,48}$ + maxLength: 63 + example: ext.ai.sap.com/my-label + value: + type: string + maxLength: 5000 + BckndInternalResourceGroupLabels: + type: array + description: Arbitrary labels as meta information + items: + $ref: '#/components/schemas/BckndInternalResourceGroupLabel' + BckndInternalResourceGroupLabel: + type: object + required: + - key + - value + properties: + key: + type: string + pattern: ^internal.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,43}$ + maxLength: 63 + example: internal.ai.sap.com/my-label + value: + type: string + maxLength: 5000 + BckndInternalResourceGroupAnnotations: + type: array + description: Arbitrary annotations as meta information + items: + $ref: '#/components/schemas/BckndInternalResourceGroupAnnotation' + BckndInternalResourceGroupAnnotation: + type: object + required: + - key + - value + properties: + key: + type: string + pattern: ^internal.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,43}$ + maxLength: 63 + example: internal.ai.sap.com/my-annotation + value: + type: string + maxLength: 5000 + BckndResourceGroupDeletionResponse: + type: object + properties: + id: + $ref: '#/components/schemas/BckndId' + message: + $ref: '#/components/schemas/BckndResourceGroupDeletionResponseMessage' + required: + - id + - message + BckndResourceGroupDeletionResponseMessage: + type: string + description: Message + example: Resource Group deletion scheduled + BckndResourceGroupPatchRequest: + type: object + properties: + labels: + $ref: '#/components/schemas/BckndResourceGroupLabels' + BckndEvent: + type: object + properties: + tenantId: + description: tenant id + type: string + action: + type: string + enum: + - PROVISION + - DEPROVISION + state: + type: string + enum: + - SUCCESSFUL + - FAILED + - PENDING + description: + description: describes the event state + type: string + createdAt: + type: string + format: date-time + example: '2017-09-28T08:56:23.275Z' + BckndTenant: + type: object + properties: + tenantId: + description: tenant id + type: string + zoneId: + description: zone id + type: string + realSubaccountId: description: real sub account id type: string servicePlan: @@ -5071,6 +5352,8 @@ components: pattern: ^[a-z0-9\-\.]+$ data: $ref: '#/components/schemas/BckndGenericSecretData' + labels: + $ref: '#/components/schemas/BckndGenericSecretLabels' BckndGenericSecretPatchBody: type: object required: @@ -5110,6 +5393,25 @@ components: required: - count - resources + BckndGenericSecretLabels: + type: array + description: Arbitrary labels as meta information + items: + $ref: '#/components/schemas/BckndGenericSecretLabel' + BckndGenericSecretLabel: + type: object + required: + - key + - value + properties: + key: + type: string + pattern: ^ext.ai.sap.com/(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]){1,48}$ + maxLength: 63 + example: ext.ai.sap.com/my-label + value: + type: string + maxLength: 5000 BckndArgoCDRepositoryData: type: object required: @@ -5786,301 +6088,160 @@ components: details: description: Optional details of the error message type: object - TrckGetMetricResource: - description: - Collection of various metrics/tags/labels associated against some - execution/deployment - type: object - properties: - executionId: - $ref: '#/components/schemas/TrckExecutionId' - metrics: - $ref: '#/components/schemas/TrckGetMetricList' - tags: - $ref: '#/components/schemas/TrckTagList' - customInfo: - $ref: '#/components/schemas/TrckCustomInfoObjectList' - required: - - executionId - TrckMetricResource: - description: - Collection of various metrics/tags/labels associated against some - execution/deployment - required: - - executionId - type: object - properties: - executionId: - $ref: '#/components/schemas/TrckExecutionId' - metrics: - $ref: '#/components/schemas/TrckMetricList' - tags: - $ref: '#/components/schemas/TrckTagList' - customInfo: - $ref: '#/components/schemas/TrckCustomInfoObjectList' - TrckGetMetricResourceList: - type: object - required: - - resources - properties: - count: - type: integer - description: Number of the resource instances in the list - resources: - type: array - items: - $ref: '#/components/schemas/TrckGetMetricResource' - TrckDeleteMetricsResponse: - type: object - properties: - id: - $ref: '#/components/schemas/TrckExecutionId' - message: - type: string - example: Metric Resource was successfully deleted - TrckExecutionId: - type: string - example: aa97b177-9383-4934-8543-0f91b7a0283a - oneOf: - - $ref: '#/components/schemas/TrckMlapiExecutionId' - description: ID of the deployment/execution - TrckTimestamp: + KpiColumnName: + readOnly: true type: string - description: Time when the metric was created or logged in RFC3339 format - format: date-time - TrckGetMetricList: - description: Array of Metric items - type: array - items: - $ref: '#/components/schemas/TrckGetMetric' - TrckMetricList: - description: Array of Metric items + description: Name of the Column + anyOf: + - enum: + - ResourceGroup + - Scenario + - Executable + - Executions + - Artifacts + - Deployments + - {} + KpiArrayOfColumnNames: + uniqueItems: true type: array + readOnly: true items: - $ref: '#/components/schemas/TrckMetric' - TrckGetMetric: - description: - Key-value metrics, where the value is numeric. Metric can also - have optional step and label fields. - type: object - required: - - name - - value - - timestamp - properties: - name: - $ref: '#/components/schemas/TrckMetricName' - value: - $ref: '#/components/schemas/TrckMetricValue' - timestamp: - $ref: '#/components/schemas/TrckTimestamp' - step: - description: - step is an optional integer that represents any measurement - of training progress (number of training iterations, number of epochs, - and so on) for the metric - type: integer - minimum: 0 - example: 2 - labels: - $ref: '#/components/schemas/TrckLabelList' - TrckMetric: - description: - Key-value metrics, where the value is numeric. Metric can also - have optional step and label fields. - required: - - name - - value - type: object - properties: - name: - $ref: '#/components/schemas/TrckMetricName' - value: - $ref: '#/components/schemas/TrckMetricValue' - timestamp: - $ref: '#/components/schemas/TrckTimestamp' - step: - description: - step is an optional integer that represents any measurement - of training progress (number of training iterations, number of epochs, - and so on) for the metric - type: integer - minimum: 0 - example: 2 - labels: - $ref: '#/components/schemas/TrckLabelList' - TrckMetricName: - pattern: '[\w-]{1,64}' + $ref: '#/components/schemas/KpiColumnName' + KpiAggregationAttribute: type: string - maxLength: 256 - description: Name of the metric - example: Error Rate - TrckMetricValue: - type: number - description: Numeric Value of the metric - example: 0.98 - TrckmetricSelectorPermissibleValues: - description: - Permissible value for $select could be either * or one or many - of the values from metrics, tags, custominfo - type: array - items: - type: string - enum: - - metrics - - tags - - customInfo - - '*' - TrckLabelList: - description: a list of name-value object pairs associated with some metric. + title: Aggregation Attribute + readOnly: true + KpiCountAggregate: + type: integer + title: CountAggregate + format: int64 + minimum: 0 + x-examples: {} + readOnly: true + KpiResultRow: type: array + title: ResultRow + uniqueItems: false + x-examples: {} + description: '' items: - $ref: '#/components/schemas/TrckLabel' - example: - - name: group - value: tree-82 - - name: metrics.ai.sap.com/Artifact.name - value: sk_learn_rf_classifier_model - TrckLabel: - description: a classifying phrase/name applied to a metric - required: - - name - - value - type: object - properties: - name: - $ref: '#/components/schemas/TrckLabelName' - value: - description: Metric Label Value - maxLength: 256 - minLength: 1 - type: string - example: sk_learn_random_forest_model - example: - name: group - value: tree-82 - TrckTagList: - description: - a list of name-value object pairs associated with the execution/deployment. - Tags are queryable. + $ref: '#/components/schemas/KpiResultRowItem' + readOnly: true + KpiResultRowItem: + title: ResultRowItem + anyOf: + - $ref: '#/components/schemas/KpiAggregationAttribute' + - $ref: '#/components/schemas/KpiCountAggregate' + x-examples: {} + KpiResultRowList: + title: ResultRowList type: array items: - $ref: '#/components/schemas/TrckTag' - TrckTag: - description: - A dictionary of name-value pairs to support segregation at execution - level. - required: - - name - - value + $ref: '#/components/schemas/KpiResultRow' + KpiResultSet: type: object + title: ResultSet + x-examples: + example-1: + header: + - ResourceGroup + - Executions + - Artifacts + - Deployments + rows: + - - 00112233-4455-6677-8899-aabbccddeeff + - 30 + - 30 + - 3 + additionalProperties: false + minProperties: 2 + maxProperties: 2 properties: - name: - oneOf: - - $ref: '#/components/schemas/TrckGenericName' - value: - description: tag value - maxLength: 256 - minLength: 1 - type: string - example: RFC-1 - example: - name: Artifact Group - value: RFC-1 - TrckCustomInfoObjectList: - description: '' - type: array - items: - $ref: '#/components/schemas/TrckCustomInfoObject' - TrckCustomInfoObject: - description: - large object which provides rendering/semantic information regarding - certain metric for consuming application or can be complex metrics in JSON - format - required: - - name - - value + header: + $ref: '#/components/schemas/KpiArrayOfColumnNames' + rows: + $ref: '#/components/schemas/KpiResultRowList' + readOnly: true + KpiApiError: type: object - properties: - name: - oneOf: - - $ref: '#/components/schemas/TrckGenericName' - value: - $ref: '#/components/schemas/TrckCustomInfoObjectData' - example: - name: Confusion Matrix - value: - "[{'Predicted': 'False', 'Actual': 'False','value': 34},{'Predicted': - 'False','Actual': 'True', 'value': 124}, {'Predicted': 'True','Actual': - 'False','value': 165},{ 'Predicted': 'True','Actual': 'True','value': - 36}]" - TrckCustomInfoObjectData: - description: Message - minLength: 1 - type: string - example: - "[{'Predicted': 'False',\t'Actual': 'False','value': 34},{'Predicted': - 'False','Actual': 'True',\t'value': 124}, {'Predicted': 'True','Actual': 'False','value': - 165},{\t'Predicted': 'True','Actual': 'True','value': 36}]" - TrckMlapiExecutionId: - description: Generic ID - pattern: ^[\w.-]{4,64}$ - type: string - example: aa97b177-9383-4934-8543-0f91b7a0283a - TrckGenericName: - description: - Generic name which can belong to a tag,label,metric or customInfo - Object - maxLength: 256 - minLength: 1 - type: string - example: sample name - TrckLabelName: - description: - Label name to label one or more metrics. "metrics.ai.sap.com/Artifact.name" - is a reserved label to associate an artifact with the metrics - maxLength: 256 - minLength: 1 - type: string - example: metrics.ai.sap.com/Artifact.name - TrckApiError: required: - code - message - type: object properties: code: - description: Descriptive error code (not http status code). type: string + description: Descriptive error code (not http status code) message: - description: plaintext error description type: string + description: Plaintext error description requestId: - description: id of individual request type: string + description: ID of the individual request + target: + type: string + description: Invoked URL + details: + description: Optional details of the error message + type: object + DSetUrl: + type: string + format: url + example: https://download.example.com/test/file.bin + DSetError: + description: Error Response + type: object + properties: + code: + type: string + minLength: 1 + message: + type: string + minLength: 1 target: - description: url that has been called + type: string + minLength: 1 + requestId: type: string details: type: array + uniqueItems: true + minItems: 0 items: - $ref: '#/components/schemas/TrckDetailsErrorResponse' - TrckDetailsErrorResponse: + required: + - code + - message + properties: + code: + type: string + minLength: 1 + message: + type: string + minLength: 1 + required: + - code + - message + x-examples: + example-1: + code: '03021655' + message: Bad request encountered. Please try again with possible-solution-here. + target: /url/path + requestId: 9832bf934f3743v3948v3 + details: + - code: '01041211' + message: Optional nested error message. + DSetFileCreationResponse: + description: Response for successful file creation type: object + required: + - message + - url properties: - code: - description: Descriptive error code (not http status code) - type: string message: - description: Plaintext error description type: string - TrckStringArray: - type: array - example: - - value1 - - value2 - items: - type: string + description: File creation response message + example: File creation acknowledged + url: + $ref: '#/components/schemas/DSetUrl' MetaCapabilities: type: object required: @@ -6315,101 +6476,6 @@ components: details: description: Optional details of the error message type: object - KpiColumnName: - readOnly: true - type: string - description: Name of the Column - anyOf: - - enum: - - ResourceGroup - - Scenario - - Executable - - Executions - - Artifacts - - Deployments - - {} - KpiArrayOfColumnNames: - uniqueItems: true - type: array - readOnly: true - items: - $ref: '#/components/schemas/KpiColumnName' - KpiAggregationAttribute: - type: string - title: Aggregation Attribute - readOnly: true - KpiCountAggregate: - type: integer - title: CountAggregate - format: int64 - minimum: 0 - x-examples: {} - readOnly: true - KpiResultRow: - type: array - title: ResultRow - uniqueItems: false - x-examples: {} - description: '' - items: - $ref: '#/components/schemas/KpiResultRowItem' - readOnly: true - KpiResultRowItem: - title: ResultRowItem - anyOf: - - $ref: '#/components/schemas/KpiAggregationAttribute' - - $ref: '#/components/schemas/KpiCountAggregate' - x-examples: {} - KpiResultRowList: - title: ResultRowList - type: array - items: - $ref: '#/components/schemas/KpiResultRow' - KpiResultSet: - type: object - title: ResultSet - x-examples: - example-1: - header: - - ResourceGroup - - Executions - - Artifacts - - Deployments - rows: - - - 00112233-4455-6677-8899-aabbccddeeff - - 30 - - 30 - - 3 - additionalProperties: false - minProperties: 2 - maxProperties: 2 - properties: - header: - $ref: '#/components/schemas/KpiArrayOfColumnNames' - rows: - $ref: '#/components/schemas/KpiResultRowList' - readOnly: true - KpiApiError: - type: object - required: - - code - - message - properties: - code: - type: string - description: Descriptive error code (not http status code) - message: - type: string - description: Plaintext error description - requestId: - type: string - description: ID of the individual request - target: - type: string - description: Invoked URL - details: - description: Optional details of the error message - type: object parameters: RTAtokenHeader: name: Authorization @@ -6533,30 +6599,6 @@ components: type: string pattern: ^[\w.-]{4,64}$ example: aa97b177-9383-4934-8543-0f91a7a0283a - DSetresourceGroupHeader: - in: header - name: AI-Resource-Group - description: Specify a resource group id - schema: - type: string - required: false - DSetpath: - name: path - in: path - required: true - schema: - type: string - format: path - pattern: ^(([\w.-]+):([\w.-]+)|([\w.-]+))(/([\w./-]+[\w.-]+)?)?$ - maxLength: 1024 - description: path relative to the object store root URL in the secret - DSetoverwrite: - name: overwrite - in: query - required: false - schema: - type: boolean - description: If true, then file is overwritten. Default is false. AiresourceGroupHeader: in: header name: AI-Resource-Group @@ -6850,6 +6892,60 @@ components: - status example: status x-visible: false + TrckqueryFilter: + example: executionId eq 'aa97b177-9383-4934-8543-0f91b7a0283a' + name: $filter + description: + Filter parameter allows filtering of metric resource using ExecutionId(s). + User can only use in, eq operators in filter expression. + schema: + type: string + in: query + required: false + deprecated: true + TrckexecutionIds: + example: executionIds=aa97b177-9383-4934-8543-0f91b7a0283a,aa97b177-9383-4934-8543-0f91b7a0283b + name: executionIds + description: + executionIds parameter allows filtering of metric resource using + single or multiple ExecutionId(s). + schema: + $ref: '#/components/schemas/TrckStringArray' + in: query + style: form + required: false + explode: false + TrckmetricAttributeSelector: + examples: + selectAll: + value: $select=* + selectSpecific: + value: $select=metrics,customInfo + name: $select + description: + returns only the resources that the client explicitly requests. + User can also pass * as a value for $select, which will behave same as that + of not passing $select query param. + schema: + $ref: '#/components/schemas/TrckmetricSelectorPermissibleValues' + in: query + style: form + required: false + explode: false + TrckexecutionId: + name: executionId + description: The Id of an execution + schema: + $ref: '#/components/schemas/TrckExecutionId' + in: query + required: true + TrcktrackingResourceGroupHeader: + name: AI-Resource-Group + description: Specify a resource group id + in: header + schema: + type: string + required: true BckndtokenHeader: name: Authorization in: header @@ -6988,67 +7084,13 @@ components: BckndquotaOnly: name: quotaOnly description: - When being set to true, the response contains only the quota of - the resource and not the quota usage. - in: query - required: false - schema: - type: boolean - example: true - TrckqueryFilter: - example: executionId eq 'aa97b177-9383-4934-8543-0f91b7a0283a' - name: $filter - description: - Filter parameter allows filtering of metric resource using ExecutionId(s). - User can only use in, eq operators in filter expression. - schema: - type: string - in: query - required: false - deprecated: true - TrckexecutionIds: - example: executionIds=aa97b177-9383-4934-8543-0f91b7a0283a,aa97b177-9383-4934-8543-0f91b7a0283b - name: executionIds - description: - executionIds parameter allows filtering of metric resource using - single or multiple ExecutionId(s). - schema: - $ref: '#/components/schemas/TrckStringArray' - in: query - style: form - required: false - explode: false - TrckmetricAttributeSelector: - examples: - selectAll: - value: $select=* - selectSpecific: - value: $select=metrics,customInfo - name: $select - description: - returns only the resources that the client explicitly requests. - User can also pass * as a value for $select, which will behave same as that - of not passing $select query param. - schema: - $ref: '#/components/schemas/TrckmetricSelectorPermissibleValues' - in: query - style: form - required: false - explode: false - TrckexecutionId: - name: executionId - description: The Id of an execution - schema: - $ref: '#/components/schemas/TrckExecutionId' - in: query - required: true - TrcktrackingResourceGroupHeader: - name: AI-Resource-Group - description: Specify a resource group id - in: header + When being set to true, the response contains only the quota of + the resource and not the quota usage. + in: query + required: false schema: - type: string - required: true + type: boolean + example: true KpiquerySelect: name: $select description: Columns to select @@ -7067,6 +7109,30 @@ components: $ref: '#/components/schemas/KpiColumnName' style: form explode: false + DSetresourceGroupHeader: + in: header + name: AI-Resource-Group + description: Specify a resource group id + schema: + type: string + required: false + DSetpath: + name: path + in: path + required: true + schema: + type: string + format: path + pattern: ^(([\w.-]+):([\w.-]+)|([\w.-]+))(/([\w./-]+[\w.-]+)?)?$ + maxLength: 1024 + description: path relative to the object store root URL in the secret + DSetoverwrite: + name: overwrite + in: query + required: false + schema: + type: boolean + description: If true, then file is overwritten. Default is false. responses: RTANotFound: description: The specified resource was not found @@ -7094,6 +7160,118 @@ components: application/json: schema: $ref: '#/components/schemas/RTAErrorResponse' + AiNotFound: + description: The specified resource was not found + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/AiApiError' + AiPreconditionFailed: + description: + The service didn't meet the precondition needed to execute this + operation + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/AiApiError' + AiBadRequest: + description: The specification of the resource was incorrect + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/AiApiError' + TrckBadRequest: + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/TrckApiError' + description: The specification of the resource was incorrect + TrckNotImplemented: + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/TrckApiError' + description: Operation is not Supported. + TrckNotFound: + description: The specified resource was not found + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/TrckApiError' + TrckPayloadTooLarge: + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/TrckApiError' + description: request entity is larger than limits defined by server. + BckndCommonError: + description: + HTTP status codes 401, 403 or 500. Response body contains further + details. + content: + application/json: + schema: + $ref: '#/components/schemas/BckndErrorResponse' + BckndNotFound: + description: The specified resource was not found + content: + application/json: + schema: + $ref: '#/components/schemas/BckndErrorResponse' + BckndBadRequest: + description: The request was malformed and could thus not be processed. + content: + application/json: + schema: + $ref: '#/components/schemas/BckndErrorResponse' + KpiNotFound: + description: The specified resource was not found + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/KpiApiError' + KpiTooManyRequests: + description: Too many requests + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/KpiApiError' + KpiInvalidRequest: + description: Invalid request + content: + application/json: + schema: + type: object + properties: + error: + $ref: '#/components/schemas/KpiApiError' DSetBadRequest: description: The specification of the resource was incorrect content: @@ -7210,91 +7388,6 @@ components: the artifact API to register this file. schema: $ref: '#/components/schemas/DSetUrl' - AiNotFound: - description: The specified resource was not found - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/AiApiError' - AiPreconditionFailed: - description: - The service didn't meet the precondition needed to execute this - operation - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/AiApiError' - AiBadRequest: - description: The specification of the resource was incorrect - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/AiApiError' - BckndCommonError: - description: - HTTP status codes 401, 403 or 500. Response body contains further - details. - content: - application/json: - schema: - $ref: '#/components/schemas/BckndErrorResponse' - BckndNotFound: - description: The specified resource was not found - content: - application/json: - schema: - $ref: '#/components/schemas/BckndErrorResponse' - BckndBadRequest: - description: The request was malformed and could thus not be processed. - content: - application/json: - schema: - $ref: '#/components/schemas/BckndErrorResponse' - TrckBadRequest: - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/TrckApiError' - description: The specification of the resource was incorrect - TrckNotImplemented: - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/TrckApiError' - description: Operation is not Supported. - TrckNotFound: - description: The specified resource was not found - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/TrckApiError' - TrckPayloadTooLarge: - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/TrckApiError' - description: request entity is larger than limits defined by server. MetaNotFound: description: The specified resource was not found content: @@ -7304,30 +7397,3 @@ components: properties: error: $ref: '#/components/schemas/MetaApiError' - KpiNotFound: - description: The specified resource was not found - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/KpiApiError' - KpiTooManyRequests: - description: Too many requests - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/KpiApiError' - KpiInvalidRequest: - description: Invalid request - content: - application/json: - schema: - type: object - properties: - error: - $ref: '#/components/schemas/KpiApiError' diff --git a/packages/langchain/package.json b/packages/langchain/package.json index 26592fbe4..1b6ca150f 100644 --- a/packages/langchain/package.json +++ b/packages/langchain/package.json @@ -30,7 +30,8 @@ "@sap-ai-sdk/core": "workspace:^", "@sap-ai-sdk/foundation-models": "workspace:^", "@sap-cloud-sdk/connectivity": "^3.25.0", - "@langchain/core": "0.3.33", + "uuid": "^11.0.0", + "@langchain/core": "0.3.36", "zod-to-json-schema": "^3.24.1" } } diff --git a/packages/langchain/src/openai/__snapshots__/util.test.ts.snap b/packages/langchain/src/openai/__snapshots__/util.test.ts.snap index a0a5a4465..5a0824750 100644 --- a/packages/langchain/src/openai/__snapshots__/util.test.ts.snap +++ b/packages/langchain/src/openai/__snapshots__/util.test.ts.snap @@ -21,7 +21,6 @@ exports[`Mapping Functions should parse an OpenAI response to a (LangChain) chat "finish_reason": "stop", "function_call": undefined, "index": 0, - "tool_call_id": "", "tool_calls": undefined, }, "content": "Hello! I’m here and ready to help. How can I assist you today?", diff --git a/packages/langchain/src/openai/types.ts b/packages/langchain/src/openai/types.ts index 81d5bad40..d6cea392e 100644 --- a/packages/langchain/src/openai/types.ts +++ b/packages/langchain/src/openai/types.ts @@ -42,10 +42,10 @@ export type AzureOpenAiChatCallOptions = BaseChatModelCallOptions & | 'logprobs' | 'top_logprobs' | 'response_format' - | 'tools' | 'tool_choice' | 'functions' | 'function_call' + | 'tools' > & { requestConfig?: CustomRequestConfig; }; diff --git a/packages/langchain/src/openai/util.ts b/packages/langchain/src/openai/util.ts index d75c3d9f2..c31a41be1 100644 --- a/packages/langchain/src/openai/util.ts +++ b/packages/langchain/src/openai/util.ts @@ -1,44 +1,32 @@ -import { AIMessage, ToolMessage } from '@langchain/core/messages'; +import { AIMessage } from '@langchain/core/messages'; import { zodToJsonSchema } from 'zod-to-json-schema'; +import { v4 as uuidv4 } from 'uuid'; +import type { ToolCall } from '@langchain/core/messages/tool'; import type { - AzureOpenAiChatCompletionRequestFunctionMessage, - AzureOpenAiChatCompletionRequestToolMessage, - AzureOpenAiChatCompletionRequestSystemMessage, AzureOpenAiChatCompletionRequestUserMessage, AzureOpenAiChatCompletionRequestAssistantMessage, AzureOpenAiChatCompletionTool, AzureOpenAiChatCompletionRequestMessage, AzureOpenAiCreateChatCompletionResponse, AzureOpenAiCreateChatCompletionRequest, - AzureOpenAiFunctionParameters + AzureOpenAiFunctionParameters, + AzureOpenAiChatCompletionMessageToolCalls, + AzureOpenAiChatCompletionRequestToolMessage, + AzureOpenAiChatCompletionRequestFunctionMessage, + AzureOpenAiChatCompletionRequestSystemMessage } from '@sap-ai-sdk/foundation-models'; -import type { BaseMessage } from '@langchain/core/messages'; +import type { + BaseMessage, + FunctionMessage, + HumanMessage, + SystemMessage, + ToolMessage +} from '@langchain/core/messages'; import type { ChatResult } from '@langchain/core/outputs'; import type { StructuredTool } from '@langchain/core/tools'; import type { AzureOpenAiChatClient } from './chat.js'; import type { AzureOpenAiChatCallOptions } from './types.js'; -type ToolChoice = - | 'none' - | 'auto' - | { - /** - * The type of the tool. - */ - type: 'function'; - /** - * Use to force the model to call a specific function. - */ - function: { - /** - * The name of the function to call. - */ - name: string; - }; - }; - -type LangChainToolChoice = string | Record | 'auto' | 'any'; - /** * Maps a LangChain {@link StructuredTool} to {@link AzureOpenAiChatCompletionFunctions}. * @param tool - Base class for tools that accept input of any shape defined by a Zod schema. @@ -71,30 +59,21 @@ function mapToolToOpenAiTool( } /** - * Maps a {@link BaseMessage} to{@link AzureOpenAiChatMessage} message role. - * @param message - The {@link BaseMessage} to map. - * @returns The {@link AzureOpenAiChatMessage} message Role. + * Maps {@link AzureOpenAiChatCompletionMessageToolCalls} to LangChain's {@link ToolCall}. + * @param toolCalls - The {@link AzureOpenAiChatCompletionMessageToolCalls} response. + * @returns The LangChain {@link ToolCall}. */ -function mapBaseMessageToRole( - message: BaseMessage -): AzureOpenAiChatCompletionRequestMessage['role'] { - const messageTypeToRoleMap = new Map< - string, - AzureOpenAiChatCompletionRequestMessage['role'] - >([ - ['human', 'user'], - ['ai', 'assistant'], - ['system', 'system'], - ['function', 'function'], - ['tool', 'tool'] - ]); - - const messageType = message._getType(); - const role = messageTypeToRoleMap.get(messageType); - if (!role) { - throw new Error(`Unsupported message type: ${messageType}`); +function mapAzureOpenAiToLangchainToolCall( + toolCalls?: AzureOpenAiChatCompletionMessageToolCalls +): ToolCall[] | undefined { + if (toolCalls) { + return toolCalls.map(toolCall => ({ + id: toolCall.id, + name: toolCall.function.name, + args: JSON.parse(toolCall.function.arguments), + type: 'tool_call' + })); } - return role; } /** @@ -107,113 +86,154 @@ export function mapOutputToChatResult( completionResponse: AzureOpenAiCreateChatCompletionResponse ): ChatResult { return { - generations: completionResponse.choices.map( - (choice: (typeof completionResponse)['choices'][0]) => ({ - text: choice.message?.content || '', - message: new AIMessage({ - content: choice.message?.content || '', - additional_kwargs: { - finish_reason: choice.finish_reason, - index: choice.index, - function_call: choice.message?.function_call, - tool_calls: choice.message?.tool_calls, - tool_call_id: '' - } - }), - generationInfo: { + generations: completionResponse.choices.map(choice => ({ + text: choice.message.content ?? '', + message: new AIMessage({ + content: choice.message.content ?? '', + tool_calls: mapAzureOpenAiToLangchainToolCall( + choice.message.tool_calls + ), + additional_kwargs: { finish_reason: choice.finish_reason, index: choice.index, - function_call: choice.message?.function_call, - tool_calls: choice.message?.tool_calls + function_call: choice.message.function_call, + tool_calls: choice.message.tool_calls } - }) - ), + }), + generationInfo: { + finish_reason: choice.finish_reason, + index: choice.index, + function_call: choice.message.function_call, + tool_calls: choice.message.tool_calls + } + })), llmOutput: { created: completionResponse.created, id: completionResponse.id, model: completionResponse.model, object: completionResponse.object, tokenUsage: { - completionTokens: completionResponse.usage?.completion_tokens || 0, - promptTokens: completionResponse.usage?.prompt_tokens || 0, - totalTokens: completionResponse.usage?.total_tokens || 0 + completionTokens: completionResponse.usage?.completion_tokens ?? 0, + promptTokens: completionResponse.usage?.prompt_tokens ?? 0, + totalTokens: completionResponse.usage?.total_tokens ?? 0 } } }; } /** - * Maps {@link BaseMessage} to {@link AzureOpenAiChatMessage}. - * @param message - The message to map. - * @returns The {@link AzureOpenAiChatMessage}. + * Maps LangChain's {@link ToolCall} to Azure OpenAI's {@link AzureOpenAiChatCompletionMessageToolCalls}. + * @param toolCalls - The {@link ToolCall} to map. + * @returns The Azure OpenAI {@link AzureOpenAiChatCompletionMessageToolCalls}. */ -function mapBaseMessageToAzureOpenAiChatMessage( - message: BaseMessage -): AzureOpenAiChatCompletionRequestMessage { - return removeUndefinedProperties({ - name: message.name ?? '', - ...mapRoleAndContent(message), - function_call: message.additional_kwargs.function_call, - tool_calls: message.additional_kwargs.tool_calls, - tool_call_id: mapToolCallId(message) - }); +function mapLangchainToolCallToAzureOpenAiToolCall( + toolCalls?: ToolCall[] +): AzureOpenAiChatCompletionMessageToolCalls | undefined { + if (toolCalls) { + return toolCalls.map(toolCall => ({ + id: toolCall.id || uuidv4(), + type: 'function', + function: { + name: toolCall.name, + arguments: JSON.stringify(toolCall.args) + } + })); + } } -// The following types are used to match a role to its specific content, otherwise TypeScript would not be able to infer the content type. - -type Role = 'system' | 'user' | 'assistant' | 'tool' | 'function'; +/** + * Maps LangChain's {@link AIMessage} to Azure OpenAI's {@link AzureOpenAiChatCompletionRequestAssistantMessage}. + * @param message - The {@link AIMessage} to map. + * @returns The Azure OpenAI {@link AzureOpenAiChatCompletionRequestAssistantMessage}. + */ +function mapAiMessageToAzureOpenAiAssistantMessage( + message: AIMessage +): AzureOpenAiChatCompletionRequestAssistantMessage { + return { + name: message.name, + tool_calls: + mapLangchainToolCallToAzureOpenAiToolCall(message.tool_calls) ?? + message.additional_kwargs.tool_calls, + function_call: message.additional_kwargs.function_call, + content: + message.content as AzureOpenAiChatCompletionRequestAssistantMessage['content'], + role: 'assistant' + }; +} -type ContentType = T extends 'system' - ? AzureOpenAiChatCompletionRequestSystemMessage['content'] - : T extends 'user' - ? AzureOpenAiChatCompletionRequestUserMessage['content'] - : T extends 'assistant' - ? AzureOpenAiChatCompletionRequestAssistantMessage['content'] - : T extends 'tool' - ? AzureOpenAiChatCompletionRequestToolMessage['content'] - : T extends 'function' - ? AzureOpenAiChatCompletionRequestFunctionMessage['content'] - : never; +function mapHumanMessageToAzureOpenAiUserMessage( + message: HumanMessage +): AzureOpenAiChatCompletionRequestUserMessage { + return { + role: 'user', + content: + message.content as AzureOpenAiChatCompletionRequestUserMessage['content'], + name: message.name + }; +} -type RoleAndContent = { - [T in Role]: { role: T; content: ContentType }; -}[Role]; +function mapToolMessageToAzureOpenAiToolMessage( + message: ToolMessage +): AzureOpenAiChatCompletionRequestToolMessage { + return { + role: 'tool', + content: + message.content as AzureOpenAiChatCompletionRequestToolMessage['content'], + tool_call_id: message.tool_call_id + }; +} -function mapRoleAndContent(baseMessage: BaseMessage): RoleAndContent { - const role = mapBaseMessageToRole(baseMessage); +function mapFunctionMessageToAzureOpenAiFunctionMessage( + message: FunctionMessage +): AzureOpenAiChatCompletionRequestFunctionMessage { return { - role, - content: baseMessage.content as ContentType - } as RoleAndContent; + role: 'function', + content: + message.content as AzureOpenAiChatCompletionRequestFunctionMessage['content'], + name: message.name || 'default' + }; } -function isStructuredToolArray(tools?: unknown[]): tools is StructuredTool[] { - return !!tools?.every(tool => - Array.isArray((tool as StructuredTool).lc_namespace) - ); +function mapSystemMessageToAzureOpenAiSystemMessage( + message: SystemMessage +): AzureOpenAiChatCompletionRequestSystemMessage { + return { + role: 'system', + content: + message.content as AzureOpenAiChatCompletionRequestSystemMessage['content'], + name: message.name + }; } /** - * Has to return an empty string to match one of the types of {@link AzureOpenAiChatCompletionRequestMessage}. - * @internal + * Maps {@link BaseMessage} to {@link AzureOpenAiChatMessage}. + * @param message - The message to map. + * @returns The {@link AzureOpenAiChatMessage}. */ -function mapToolCallId(message: BaseMessage): string { - return ToolMessage.isInstance(message) ? message.tool_call_id : ''; -} - -function mapToolChoice( - toolChoice?: LangChainToolChoice -): ToolChoice | undefined { - if (toolChoice === 'auto' || toolChoice === 'none') { - return toolChoice; +// TODO: Add mapping of refusal property, once LangChain base class supports it natively. +function mapBaseMessageToAzureOpenAiChatMessage( + message: BaseMessage +): AzureOpenAiChatCompletionRequestMessage { + switch (message.getType()) { + case 'ai': + return mapAiMessageToAzureOpenAiAssistantMessage(message); + case 'human': + return mapHumanMessageToAzureOpenAiUserMessage(message); + case 'system': + return mapSystemMessageToAzureOpenAiSystemMessage(message); + case 'function': + return mapFunctionMessageToAzureOpenAiFunctionMessage(message); + case 'tool': + return mapToolMessageToAzureOpenAiToolMessage(message as ToolMessage); + default: + throw new Error(`Unsupported message type: ${message.getType()}`); } +} - if (typeof toolChoice === 'string') { - return { - type: 'function', - function: { name: toolChoice } - }; - } +function isStructuredToolArray(tools?: unknown[]): tools is StructuredTool[] { + return !!tools?.every(tool => + Array.isArray((tool as StructuredTool).lc_namespace) + ); } /** @@ -252,7 +272,7 @@ export function mapLangchainToAiClient( tools: isStructuredToolArray(options?.tools) ? options?.tools.map(mapToolToOpenAiTool) : options?.tools, - tool_choice: mapToolChoice(options?.tool_choice) + tool_choice: options?.tool_choice }); } diff --git a/packages/orchestration/README.md b/packages/orchestration/README.md index 789df475b..a20dc052c 100644 --- a/packages/orchestration/README.md +++ b/packages/orchestration/README.md @@ -370,19 +370,25 @@ const orchestrationClient = new OrchestrationClient({ output_param: 'groundingOutput', filters: [ { - id: 'filter1', - data_repositories: ['repository-id'] + id: 'FILTER_ID', + // data_repository_type: 'vector', // optional, default value is 'vector' + data_repositories: ['REPOSITORY_ID'], } ], ) }); const response = await orchestrationClient.chatCompletion({ - inputParams: { groundingRequest: 'What is Generative AI Hub in SAP AI Core?' } + inputParams: { groundingRequest: 'Give me a short introduction of SAP AI Core.' } }); return response.getContent(); ``` +By default, the optional filter property `data_repository_type` is set to `vector`. +Set it to `help.sap.com` to retrieve context from the SAP Help Portal. +Set `data_respotiories` property with an array of `REPOSITORY_ID` values to search in specific data repositories. +Skip this property to search in all available data repositories. + ### Using a JSON Configuration from AI Launchpad If you already have an orchestration workflow created in AI Launchpad, you can either download the configuration as a JSON file or copy the JSON string directly to use it with the orchestration client. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66ccc8342..60915381c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,15 +4,15 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -pnpmfileChecksum: fb3vh7gyjzvxzzal7fbygn3ogm +pnpmfileChecksum: sha256-7lht5Q+T9K1tkr5FYaoHEDBAtJqjkSrAs2jGbKMfTIY= importers: .: devDependencies: '@changesets/cli': - specifier: ^2.27.11 - version: 2.27.11 + specifier: ^2.27.12 + version: 2.27.12 '@jest/globals': specifier: ^29.5.12 version: 29.7.0 @@ -33,7 +33,7 @@ importers: version: 3.25.0 '@sap-cloud-sdk/eslint-config': specifier: ^3.25.0 - version: 3.25.0(@types/eslint@8.56.10)(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(prettier@3.4.2)(typescript@5.7.3) + version: 3.25.0(@types/eslint@8.56.10)(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(prettier@3.4.2)(typescript@5.7.3) '@sap-cloud-sdk/generator-common': specifier: ^3.25.0 version: 3.25.0 @@ -50,26 +50,26 @@ importers: specifier: ^29.5.14 version: 29.5.14 '@types/jsonwebtoken': - specifier: ^9.0.7 - version: 9.0.7 + specifier: ^9.0.8 + version: 9.0.8 '@types/mock-fs': specifier: ^4.13.4 version: 4.13.4 '@types/node': - specifier: ^20.17.14 - version: 20.17.14 + specifier: ^20.17.16 + version: 20.17.16 depcheck: specifier: ^1.4.7 version: 1.4.7 eslint: - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.19.0 + version: 9.19.0 glob: specifier: ^11.0.1 version: 11.0.1 jest: specifier: ^30.0.0-alpha.6 - version: 30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + version: 30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -77,8 +77,8 @@ importers: specifier: ^5.4.1 version: 5.4.1 nock: - specifier: ^13.5.6 - version: 13.5.6 + specifier: ^14.0.0 + version: 14.0.0 node-jq: specifier: ^6.0.1 version: 6.0.1 @@ -87,10 +87,10 @@ importers: version: 3.4.2 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.14)(typescript@5.7.3) + version: 10.9.2(@types/node@20.17.16)(typescript@5.7.3) tsx: specifier: ^4.19.2 version: 4.19.2 @@ -149,8 +149,8 @@ importers: packages/langchain: dependencies: '@langchain/core': - specifier: 0.3.33 - version: 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + specifier: 0.3.36 + version: 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) '@sap-ai-sdk/ai-api': specifier: workspace:^ version: link:../ai-api @@ -163,6 +163,9 @@ importers: '@sap-cloud-sdk/connectivity': specifier: ^3.25.0 version: 3.25.0 + uuid: + specifier: ^11.0.0 + version: 11.0.5 zod-to-json-schema: specifier: ^3.24.1 version: 3.24.1(zod@3.24.1) @@ -214,11 +217,11 @@ importers: sample-code: dependencies: '@langchain/core': - specifier: 0.3.33 - version: 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + specifier: 0.3.36 + version: 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) '@langchain/textsplitters': specifier: 0.1.0 - version: 0.1.0(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1))) + version: 0.1.0(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1))) '@sap-ai-sdk/ai-api': specifier: workspace:^ version: link:../packages/ai-api @@ -244,8 +247,8 @@ importers: specifier: ^4.21.2 version: 4.21.2 langchain: - specifier: 0.3.12 - version: 0.3.12(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.79.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0) + specifier: 0.3.13 + version: 0.3.13(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.80.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0) tests/e2e-tests: dependencies: @@ -284,26 +287,26 @@ importers: tests/smoke-tests: dependencies: '@langchain/core': - specifier: 0.3.33 - version: 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + specifier: 0.3.36 + version: 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) '@langchain/textsplitters': specifier: 0.1.0 - version: 0.1.0(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1))) + version: 0.1.0(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1))) '@sap-ai-sdk/ai-api': specifier: canary - version: 1.6.1-20250122013113.0 + version: 1.6.1-20250126013051.0 '@sap-ai-sdk/document-grounding': specifier: canary - version: 1.6.1-20250122013113.0 + version: 1.6.1-20250126013051.0 '@sap-ai-sdk/foundation-models': specifier: canary - version: 1.6.1-20250122013113.0 + version: 1.6.1-20250126013051.0 '@sap-ai-sdk/langchain': specifier: canary - version: 1.6.1-20250122013113.0(openai@4.79.1(ws@8.18.0)(zod@3.24.1))(zod@3.24.1) + version: 1.6.1-20250126013051.0(openai@4.80.1(ws@8.18.0)(zod@3.24.1))(zod@3.24.1) '@sap-ai-sdk/orchestration': specifier: canary - version: 1.6.1-20250122013113.0 + version: 1.6.1-20250126013051.0 '@sap-cloud-sdk/util': specifier: ^3.25.0 version: 3.25.0 @@ -311,8 +314,8 @@ importers: specifier: ^4.21.2 version: 4.21.2 langchain: - specifier: 0.3.12 - version: 0.3.12(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.79.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0) + specifier: 0.3.13 + version: 0.3.13(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.80.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0) devDependencies: '@types/express': specifier: ^5.0.0 @@ -518,8 +521,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': @@ -560,8 +563,8 @@ packages: '@cfworker/json-schema@4.1.0': resolution: {integrity: sha512-/vYKi/qMxwNsuIJ9WGWwM2rflY40ZenK3Kh4uR5vB9/Nz12Y7IUN/Xf4wDA7vzPfw0VNh3b/jz4+MjcVgARKJg==} - '@changesets/apply-release-plan@7.0.7': - resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} + '@changesets/apply-release-plan@7.0.8': + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} '@changesets/assemble-release-plan@6.0.5': resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} @@ -569,8 +572,8 @@ packages: '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.11': - resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} + '@changesets/cli@2.27.12': + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} hasBin: true '@changesets/config@3.0.5': @@ -788,6 +791,10 @@ packages: resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.10.0': resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -804,14 +811,18 @@ packages: resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/js@9.19.0': + resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.3': resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -992,16 +1003,16 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@langchain/core@0.3.32': - resolution: {integrity: sha512-QesrB7qPrvdIKgCL6/hfa1e7+5dCCgunN5nRGvr0LYWEVuLBrUd93PDvpPP9Fk43+HZnS16adTCYOwX0Jad5Bw==} - engines: {node: '>=18'} - '@langchain/core@0.3.33': resolution: {integrity: sha512-gIszaRKWmP1HEgOhJLJaMiTMH8U3W9hG6raWihwpCTb0Ns7owjrmaqmgMa9h3W4/0xriaKfrfFBd6tepKsfxZA==} engines: {node: '>=18'} - '@langchain/openai@0.3.17': - resolution: {integrity: sha512-uw4po32OKptVjq+CYHrumgbfh4NuD7LqyE+ZgqY9I/LrLc6bHLMc+sisHmI17vgek0K/yqtarI0alPJbzrwyag==} + '@langchain/core@0.3.36': + resolution: {integrity: sha512-lOS6f5o2MarjGPomHPhzde9xI3lZW2NIOEdCv0dvjb1ZChWhwXWHtAMHSZmuSB53ySzDWAMkimimHd+Yqz5MwQ==} + engines: {node: '>=18'} + + '@langchain/openai@0.4.2': + resolution: {integrity: sha512-Cuj7qbVcycALTP0aqZuPpEc7As8cwiGaU21MhXRyZFs+dnWxKYxZ1Q1z4kcx6cYkq/I+CNwwmk+sP+YruU73Aw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.3.29 <0.4.0' @@ -1018,6 +1029,10 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mswjs/interceptors@0.37.5': + resolution: {integrity: sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==} + engines: {node: '>=18'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1038,6 +1053,15 @@ packages: resolution: {integrity: sha512-SvLTSclf104IVX8BY7nWqess1pBmeNl9qRFTWjOXg7B1/ESemfEtZYBDRAXAp1ILvazDng5IF/7YSbTxDVbwNg==} engines: {node: '>=18.0.0'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1049,23 +1073,23 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sap-ai-sdk/ai-api@1.6.1-20250122013113.0': - resolution: {integrity: sha512-4nv4Lu73kUUXniCOUECbxHtUSjpMuntCCbGftU3kqzQiWvKEyop9zhcGO8vfgZewccBWuImXgZOVzMzXhnVVpA==} + '@sap-ai-sdk/ai-api@1.6.1-20250126013051.0': + resolution: {integrity: sha512-FKOq2jikzbleoP0TWbZRPYige20x/aDQIdldh1d9gYg/aEs9lyvXcZIUT+nouG1h3M0YrXNSZsfg0J8f+c15MQ==} - '@sap-ai-sdk/core@1.6.1-20250122013113.0': - resolution: {integrity: sha512-zNLx63MCZZnHIGEN60lC9Y0TN604NKde9/ba4xGPmCrCYn/zpBN4AB6uPIQRQZipCHJYJw9Srsq/BbgQt3CdvQ==} + '@sap-ai-sdk/core@1.6.1-20250126013051.0': + resolution: {integrity: sha512-3HVt+oGwmS1eH97g1i6UQgHSNXYdDSwXJ/h8iU4PhTInRPLIkrtT2tqIl27/yT2l+eCIiFHmnOwbSSLbjUqZZw==} - '@sap-ai-sdk/document-grounding@1.6.1-20250122013113.0': - resolution: {integrity: sha512-nnKGTPYCK8g4qlxmALsrVNAfyNjN/7ijURKj7TbZrZ0zDzQ9ANN8Clntdvkp23CHGndM9+fTHn3OfKg/NDLc6w==} + '@sap-ai-sdk/document-grounding@1.6.1-20250126013051.0': + resolution: {integrity: sha512-DjgaozJZGzNf3CgnxWNsQAtQc4TTeJXnNwgWRHUrzbCAQXiFO13wC1IZsCqFLsailCsVAj553AlEFh2wMSVG0Q==} - '@sap-ai-sdk/foundation-models@1.6.1-20250122013113.0': - resolution: {integrity: sha512-RpJlZ2GLbLIn9ZEUasV5I0/QOlkmgD/bRNeYoayz51OrvWuFdUSghIWuEHsCdfW2fCHD9C8TOZtGubokgkoK1A==} + '@sap-ai-sdk/foundation-models@1.6.1-20250126013051.0': + resolution: {integrity: sha512-yoUiVil684qGG35unmWF8ww+QpE5dyr4+tyKfVgPjMv1I0D1ZpFUB1FseQfe2TP66k/uV3UeoQZqJktEPlxtkw==} - '@sap-ai-sdk/langchain@1.6.1-20250122013113.0': - resolution: {integrity: sha512-gcvVwIpXOupe7YdF42imYHkzpsWLrdh/kAfTt23RTfEMqZ44xFvdvqScY+v0Ej6oamRAgN7xXj3KGP4sf3M+UQ==} + '@sap-ai-sdk/langchain@1.6.1-20250126013051.0': + resolution: {integrity: sha512-T2OlNwWWd+Lz06k2UmS/It6ucvQ7C1ixjyBR/pOszdrhhWMugfKiZmsPPFiPGpWFGXx/n/irWADj5fM4maXNiw==} - '@sap-ai-sdk/orchestration@1.6.1-20250122013113.0': - resolution: {integrity: sha512-XReVwjIHgOgG5R1G2PIRuJQq0WU1GeoBeT2k18lW6LlnRA0zKD/pK1lvSEYgYllP/QCdpZ4tQenk6cMrWJyWVQ==} + '@sap-ai-sdk/orchestration@1.6.1-20250126013051.0': + resolution: {integrity: sha512-21sGkgHnBvVMoclfjhsv7UyxVPtXttbqjOOh9Lbed+W/cfrFFvmi9rgmuPu5owj6fVaNPvD0TpKUJGvO4g3+jQ==} '@sap-cloud-sdk/connectivity@3.25.0': resolution: {integrity: sha512-mf9TA7brehISMtI/6/RoJ+c+mTyAJOzWVccv/3WrTUrPxmE+m5MZOsXH/rnbwo9ZZ1jw3NlDn1xOPamSq8VD/A==} @@ -1262,8 +1286,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.7': - resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + '@types/jsonwebtoken@9.0.8': + resolution: {integrity: sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -1277,20 +1301,20 @@ packages: '@types/mock-fs@4.13.4': resolution: {integrity: sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.71': - resolution: {integrity: sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw==} + '@types/node@18.19.74': + resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==} - '@types/node@20.17.13': - resolution: {integrity: sha512-RNf+4dEeV69PIvyp++4IKM2vnLXtmp/JovfeQm5P5+qpKb6wHoH7INywLdZ7z+gVX46kgBP/fwJJvZYaHxtdyw==} - - '@types/node@20.17.14': - resolution: {integrity: sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==} + '@types/node@20.17.16': + resolution: {integrity: sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1744,8 +1768,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} cjs-module-lexer@1.3.1: @@ -2282,8 +2306,8 @@ packages: jiti: optional: true - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.19.0: + resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2450,8 +2474,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -2855,6 +2879,9 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -3236,8 +3263,8 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - langchain@0.3.12: - resolution: {integrity: sha512-BjdQ/f/66W05L8nRgX74bf5QvJIphpg+K5ZTmQwGE8Gk3umtzHp8T4YIRFYjvTxU4XQrGXOgWk1Y9rk5uBbjKA==} + langchain@0.3.13: + resolution: {integrity: sha512-QIQocx2goCBMgCw+hXjDiCW/5P/Q4HbNjaGEbG2FPHzFl48aw36GJvcyEbg91GqjhyH+lsIlYIWMcdDqn5Z5Lw==} engines: {node: '>=18'} peerDependencies: '@langchain/anthropic': '*' @@ -3288,16 +3315,8 @@ packages: typeorm: optional: true - langsmith@0.3.0: - resolution: {integrity: sha512-VUO2j1pKqZBIwcllEuD4H3EUNKGOKabJiwPDqSeTaZNXQQxvT3GPIyi+myGmkLrmOG3Y6jMDNTC4yxzJRQvakw==} - peerDependencies: - openai: '*' - peerDependenciesMeta: - openai: - optional: true - - langsmith@0.3.2: - resolution: {integrity: sha512-QUaO6KdinTpts/vBsyPro/R0/Iop+TwTyEYYX8aSIvzwj5EVZY2/VxOefll51t1/E6sISEnra1EwdSCS74Y5NA==} + langsmith@0.3.3: + resolution: {integrity: sha512-B9B0ThaPYwNdTg9ck6bWF2Mjd1TJvVKLfLedufIudmO8aPDslcc2uVlyPEtskZFEdmfjfVHEqDnhnuAhyifrZQ==} peerDependencies: openai: '*' peerDependenciesMeta: @@ -3550,9 +3569,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nock@13.5.6: - resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} - engines: {node: '>= 10.13'} + nock@14.0.0: + resolution: {integrity: sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==} + engines: {node: '>= 18'} node-abi@3.71.0: resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} @@ -3672,8 +3691,8 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - openai@4.79.1: - resolution: {integrity: sha512-M7P5/PKnT/S/B5v0D64giC9mjyxFYkqlCuQFzR5hkdzMdqUuHf8T1gHhPGPF5oAvu4+PO3TvJv/qhZoS2bqAkw==} + openai@4.80.1: + resolution: {integrity: sha512-+6+bbXFwbIE88foZsBEt36bPkgZPdyFN82clAXG61gnHb2gXdZApDyRrcAHqEtpYICywpqaNo57kOm9dtnb7Cw==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -3706,6 +3725,9 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -3753,8 +3775,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -3815,8 +3837,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -4217,6 +4239,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -4534,8 +4559,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.19.6: - resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} undici@6.21.1: resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} @@ -4577,6 +4602,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.0.5: + resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -4800,7 +4829,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/compat-data@7.24.7': {} @@ -4899,7 +4928,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/parser@7.25.3': dependencies: @@ -4975,7 +5004,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - '@babel/runtime@7.25.0': + '@babel/runtime@7.26.7': dependencies: regenerator-runtime: 0.14.1 @@ -5032,7 +5061,7 @@ snapshots: '@cfworker/json-schema@4.1.0': {} - '@changesets/apply-release-plan@7.0.7': + '@changesets/apply-release-plan@7.0.8': dependencies: '@changesets/config': 3.0.5 '@changesets/get-version-range-type': 0.4.0 @@ -5061,9 +5090,9 @@ snapshots: dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.11': + '@changesets/cli@2.27.12': dependencies: - '@changesets/apply-release-plan': 7.0.7 + '@changesets/apply-release-plan': 7.0.8 '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 '@changesets/config': 3.0.5 @@ -5085,8 +5114,8 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.0 - picocolors: 1.1.0 + package-manager-detector: 0.2.8 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 spawndamnit: 3.0.1 @@ -5110,7 +5139,7 @@ snapshots: dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 + picocolors: 1.1.1 semver: 7.6.3 '@changesets/get-release-plan@4.0.6': @@ -5134,7 +5163,7 @@ snapshots: '@changesets/logger@0.1.1': dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/parse@0.4.0': dependencies: @@ -5156,7 +5185,7 @@ snapshots: '@changesets/types': 6.0.0 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/should-skip-package@0.1.1': dependencies: @@ -5269,9 +5298,9 @@ snapshots: eslint: 9.17.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0)': dependencies: - eslint: 9.18.0 + eslint: 9.19.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -5284,6 +5313,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/config-array@0.19.1': + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@eslint/core@0.10.0': dependencies: '@types/json-schema': 7.0.15 @@ -5306,10 +5343,12 @@ snapshots: '@eslint/js@9.17.0': {} - '@eslint/js@9.18.0': {} + '@eslint/js@9.19.0': {} '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.5': {} + '@eslint/plugin-kit@0.2.3': dependencies: levn: 0.4.1 @@ -5360,13 +5399,13 @@ snapshots: '@jest/console@30.0.0-alpha.6': dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 jest-message-util: 30.0.0-alpha.6 jest-util: 30.0.0-alpha.6 slash: 3.0.0 - '@jest/core@30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3))': + '@jest/core@30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3))': dependencies: '@jest/console': 30.0.0-alpha.6 '@jest/pattern': 30.0.0-alpha.6 @@ -5374,14 +5413,14 @@ snapshots: '@jest/test-result': 30.0.0-alpha.6 '@jest/transform': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.0.0 + ci-info: 4.1.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.0-alpha.6 - jest-config: 30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + jest-config: 30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) jest-haste-map: 30.0.0-alpha.6 jest-message-util: 30.0.0-alpha.6 jest-regex-util: 30.0.0-alpha.6 @@ -5407,14 +5446,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-mock: 29.7.0 '@jest/environment@30.0.0-alpha.6': dependencies: '@jest/fake-timers': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-mock: 30.0.0-alpha.6 '@jest/expect-utils@29.7.0': @@ -5443,7 +5482,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -5452,7 +5491,7 @@ snapshots: dependencies: '@jest/types': 30.0.0-alpha.6 '@sinonjs/fake-timers': 11.2.2 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-message-util: 30.0.0-alpha.6 jest-mock: 30.0.0-alpha.6 jest-util: 30.0.0-alpha.6 @@ -5477,7 +5516,7 @@ snapshots: '@jest/pattern@30.0.0-alpha.6': dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-regex-util: 30.0.0-alpha.6 '@jest/reporters@30.0.0-alpha.6': @@ -5488,7 +5527,7 @@ snapshots: '@jest/transform': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -5589,7 +5628,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.14 + '@types/node': 20.17.16 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -5599,7 +5638,7 @@ snapshots: '@jest/schemas': 30.0.0-alpha.6 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.14 + '@types/node': 20.17.16 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -5629,14 +5668,14 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@langchain/core@0.3.32(openai@4.79.1(ws@8.18.0)(zod@3.24.1))': + '@langchain/core@0.3.33(openai@4.80.1(ws@8.18.0)(zod@3.24.1))': dependencies: '@cfworker/json-schema': 4.1.0 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.16 - langsmith: 0.3.2(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + langsmith: 0.3.3(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -5646,14 +5685,14 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1))': + '@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1))': dependencies: '@cfworker/json-schema': 4.1.0 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.16 - langsmith: 0.3.2(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + langsmith: 0.3.3(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -5663,38 +5702,47 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/openai@0.3.17(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))(ws@8.18.0)': + '@langchain/openai@0.4.2(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))(ws@8.18.0)': dependencies: - '@langchain/core': 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + '@langchain/core': 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) js-tiktoken: 1.0.16 - openai: 4.79.1(ws@8.18.0)(zod@3.24.1) + openai: 4.80.1(ws@8.18.0)(zod@3.24.1) zod: 3.24.1 zod-to-json-schema: 3.24.1(zod@3.24.1) transitivePeerDependencies: - encoding - ws - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))': + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + '@langchain/core': 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) js-tiktoken: 1.0.14 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.7 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.7 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 + '@mswjs/interceptors@0.37.5': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5729,6 +5777,15 @@ snapshots: wordwrap: 1.0.0 wrap-ansi: 7.0.0 + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -5736,15 +5793,15 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sap-ai-sdk/ai-api@1.6.1-20250122013113.0': + '@sap-ai-sdk/ai-api@1.6.1-20250126013051.0': dependencies: - '@sap-ai-sdk/core': 1.6.1-20250122013113.0 + '@sap-ai-sdk/core': 1.6.1-20250126013051.0 '@sap-cloud-sdk/connectivity': 3.25.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/core@1.6.1-20250122013113.0': + '@sap-ai-sdk/core@1.6.1-20250126013051.0': dependencies: '@sap-cloud-sdk/connectivity': 3.25.0 '@sap-cloud-sdk/http-client': 3.25.0 @@ -5754,17 +5811,17 @@ snapshots: - debug - supports-color - '@sap-ai-sdk/document-grounding@1.6.1-20250122013113.0': + '@sap-ai-sdk/document-grounding@1.6.1-20250126013051.0': dependencies: - '@sap-ai-sdk/core': 1.6.1-20250122013113.0 + '@sap-ai-sdk/core': 1.6.1-20250126013051.0 transitivePeerDependencies: - debug - supports-color - '@sap-ai-sdk/foundation-models@1.6.1-20250122013113.0': + '@sap-ai-sdk/foundation-models@1.6.1-20250126013051.0': dependencies: - '@sap-ai-sdk/ai-api': 1.6.1-20250122013113.0 - '@sap-ai-sdk/core': 1.6.1-20250122013113.0 + '@sap-ai-sdk/ai-api': 1.6.1-20250126013051.0 + '@sap-ai-sdk/core': 1.6.1-20250126013051.0 '@sap-cloud-sdk/connectivity': 3.25.0 '@sap-cloud-sdk/http-client': 3.25.0 '@sap-cloud-sdk/util': 3.25.0 @@ -5772,12 +5829,12 @@ snapshots: - debug - supports-color - '@sap-ai-sdk/langchain@1.6.1-20250122013113.0(openai@4.79.1(ws@8.18.0)(zod@3.24.1))(zod@3.24.1)': + '@sap-ai-sdk/langchain@1.6.1-20250126013051.0(openai@4.80.1(ws@8.18.0)(zod@3.24.1))(zod@3.24.1)': dependencies: - '@langchain/core': 0.3.32(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) - '@sap-ai-sdk/ai-api': 1.6.1-20250122013113.0 - '@sap-ai-sdk/core': 1.6.1-20250122013113.0 - '@sap-ai-sdk/foundation-models': 1.6.1-20250122013113.0 + '@langchain/core': 0.3.33(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) + '@sap-ai-sdk/ai-api': 1.6.1-20250126013051.0 + '@sap-ai-sdk/core': 1.6.1-20250126013051.0 + '@sap-ai-sdk/foundation-models': 1.6.1-20250126013051.0 '@sap-cloud-sdk/connectivity': 3.25.0 zod-to-json-schema: 3.24.1(zod@3.24.1) transitivePeerDependencies: @@ -5786,10 +5843,10 @@ snapshots: - supports-color - zod - '@sap-ai-sdk/orchestration@1.6.1-20250122013113.0': + '@sap-ai-sdk/orchestration@1.6.1-20250126013051.0': dependencies: - '@sap-ai-sdk/ai-api': 1.6.1-20250122013113.0 - '@sap-ai-sdk/core': 1.6.1-20250122013113.0 + '@sap-ai-sdk/ai-api': 1.6.1-20250126013051.0 + '@sap-ai-sdk/core': 1.6.1-20250126013051.0 '@sap-cloud-sdk/util': 3.25.0 transitivePeerDependencies: - debug @@ -5808,20 +5865,20 @@ snapshots: - debug - supports-color - '@sap-cloud-sdk/eslint-config@3.25.0(@types/eslint@8.56.10)(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(prettier@3.4.2)(typescript@5.7.3)': + '@sap-cloud-sdk/eslint-config@3.25.0(@types/eslint@8.56.10)(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(prettier@3.4.2)(typescript@5.7.3)': dependencies: '@eslint/js': 9.17.0 - '@stylistic/eslint-plugin': 2.12.1(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 - eslint-config-prettier: 9.1.0(eslint@9.18.0) - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0))(eslint@9.18.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) - eslint-plugin-jsdoc: 50.6.1(eslint@9.18.0) - eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2) - eslint-plugin-regex: 1.10.0(eslint@9.18.0) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0) - typescript-eslint: 8.18.1(eslint@9.18.0)(typescript@5.7.3) + '@stylistic/eslint-plugin': 2.12.1(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + eslint: 9.19.0 + eslint-config-prettier: 9.1.0(eslint@9.19.0) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0))(eslint@9.19.0) + eslint-plugin-jsdoc: 50.6.1(eslint@9.19.0) + eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) + eslint-plugin-regex: 1.10.0(eslint@9.19.0) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) + typescript-eslint: 8.18.1(eslint@9.19.0)(typescript@5.7.3) transitivePeerDependencies: - '@types/eslint' - '@typescript-eslint/eslint-plugin' @@ -6019,10 +6076,10 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@stylistic/eslint-plugin@2.12.1(eslint@9.18.0)(typescript@5.7.3)': + '@stylistic/eslint-plugin@2.12.1(eslint@9.19.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/utils': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + eslint: 9.19.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -6069,11 +6126,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.13 + '@types/node': 20.17.16 '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.13 + '@types/node': 20.17.16 '@types/eslint@7.29.0': dependencies: @@ -6090,7 +6147,7 @@ snapshots: '@types/express-serve-static-core@5.0.0': dependencies: - '@types/node': 20.17.13 + '@types/node': 20.17.16 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -6104,7 +6161,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 '@types/http-errors@2.0.4': {} @@ -6127,9 +6184,10 @@ snapshots: '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.7': + '@types/jsonwebtoken@9.0.8': dependencies: - '@types/node': 20.17.14 + '@types/ms': 2.1.0 + '@types/node': 20.17.16 '@types/mime@1.3.5': {} @@ -6139,26 +6197,24 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 + + '@types/ms@2.1.0': {} '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 form-data: 4.0.1 '@types/node@12.20.55': {} - '@types/node@18.19.71': + '@types/node@18.19.74': dependencies: undici-types: 5.26.5 - '@types/node@20.17.13': - dependencies: - undici-types: 6.19.6 - - '@types/node@20.17.14': + '@types/node@20.17.16': dependencies: - undici-types: 6.19.6 + undici-types: 6.19.8 '@types/normalize-package-data@2.4.4': {} @@ -6175,12 +6231,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.13 + '@types/node': 20.17.16 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.13 + '@types/node': 20.17.16 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -6195,15 +6251,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.18.1(eslint@9.19.0)(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.18.1(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.18.1(eslint@9.19.0)(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.18.1 - eslint: 9.18.0 + eslint: 9.19.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -6212,14 +6268,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.18.1 '@typescript-eslint/types': 8.18.1 '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.18.1 debug: 4.4.0(supports-color@8.1.1) - eslint: 9.18.0 + eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -6229,12 +6285,12 @@ snapshots: '@typescript-eslint/types': 8.18.1 '@typescript-eslint/visitor-keys': 8.18.1 - '@typescript-eslint/type-utils@8.18.1(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.18.1(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.18.1(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.18.1(eslint@9.19.0)(typescript@5.7.3) debug: 4.4.0(supports-color@8.1.1) - eslint: 9.18.0 + eslint: 9.19.0 ts-api-utils: 1.4.3(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -6256,13 +6312,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.18.1(eslint@9.19.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) '@typescript-eslint/scope-manager': 8.18.1 '@typescript-eslint/types': 8.18.1 '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.3) - eslint: 9.18.0 + eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -6729,7 +6785,7 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.0.0: {} + ci-info@4.1.0: {} cjs-module-lexer@1.3.1: {} @@ -7195,9 +7251,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.18.0): + eslint-config-prettier@9.1.0(eslint@9.19.0): dependencies: - eslint: 9.18.0 + eslint: 9.19.0 eslint-formatter-pretty@4.1.0: dependencies: @@ -7218,34 +7274,34 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0))(eslint@9.18.0): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@8.1.1) enhanced-resolve: 5.18.0 - eslint: 9.18.0 + eslint: 9.19.0 fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0))(eslint@9.19.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0))(eslint@9.18.0))(eslint@9.18.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0))(eslint@9.19.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/parser': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + eslint: 9.19.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0))(eslint@9.18.0) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0))(eslint@9.19.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -7254,9 +7310,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0 + eslint: 9.19.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0))(eslint@9.18.0))(eslint@9.18.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0))(eslint@9.19.0))(eslint@9.19.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -7268,20 +7324,20 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.18.1(eslint@9.19.0)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@50.6.1(eslint@9.18.0): + eslint-plugin-jsdoc@50.6.1(eslint@9.19.0): dependencies: '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 9.18.0 + eslint: 9.19.0 espree: 10.3.0 esquery: 1.6.0 parse-imports: 2.2.1 @@ -7291,25 +7347,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2): + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2): dependencies: - eslint: 9.18.0 + eslint: 9.19.0 prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@9.18.0) + eslint-config-prettier: 9.1.0(eslint@9.19.0) - eslint-plugin-regex@1.10.0(eslint@9.18.0): + eslint-plugin-regex@1.10.0(eslint@9.19.0): dependencies: - eslint: 9.18.0 + eslint: 9.19.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): dependencies: - eslint: 9.18.0 + eslint: 9.19.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) eslint-rule-docs@1.1.235: {} @@ -7361,14 +7417,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.18.0: + eslint@9.19.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 + '@eslint/config-array': 0.19.1 '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 + '@eslint/js': 9.19.0 '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -7601,10 +7657,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.2: {} fn.name@1.1.0: {} @@ -8029,6 +8085,8 @@ snapshots: is-map@2.0.3: {} + is-node-process@1.2.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -8175,7 +8233,7 @@ snapshots: '@jest/expect': 30.0.0-alpha.6 '@jest/test-result': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -8195,15 +8253,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)): + jest-cli@30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)): dependencies: - '@jest/core': 30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + '@jest/core': 30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) '@jest/test-result': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 chalk: 4.1.2 exit: 0.1.2 import-local: 3.1.0 - jest-config: 30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + jest-config: 30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) jest-util: 30.0.0-alpha.6 jest-validate: 30.0.0-alpha.6 yargs: 17.7.2 @@ -8214,7 +8272,7 @@ snapshots: - supports-color - ts-node - jest-config@30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)): + jest-config@30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)): dependencies: '@babel/core': 7.24.7 '@jest/pattern': 30.0.0-alpha.6 @@ -8222,7 +8280,7 @@ snapshots: '@jest/types': 30.0.0-alpha.6 babel-jest: 30.0.0-alpha.6(@babel/core@7.24.7) chalk: 4.1.2 - ci-info: 4.0.0 + ci-info: 4.1.0 deepmerge: 4.3.1 glob: 10.4.5 graceful-fs: 4.2.11 @@ -8241,8 +8299,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.17.14 - ts-node: 10.9.2(@types/node@20.17.14)(typescript@5.7.3) + '@types/node': 20.17.16 + ts-node: 10.9.2(@types/node@20.17.16)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8278,7 +8336,7 @@ snapshots: '@jest/environment': 30.0.0-alpha.6 '@jest/fake-timers': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-mock: 30.0.0-alpha.6 jest-util: 30.0.0-alpha.6 @@ -8290,7 +8348,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.14 + '@types/node': 20.17.16 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8305,7 +8363,7 @@ snapshots: jest-haste-map@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8363,13 +8421,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-util: 29.7.0 jest-mock@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-util: 30.0.0-alpha.6 jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.6): @@ -8406,7 +8464,7 @@ snapshots: '@jest/test-result': 30.0.0-alpha.6 '@jest/transform': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -8434,7 +8492,7 @@ snapshots: '@jest/test-result': 30.0.0-alpha.6 '@jest/transform': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 @@ -8506,7 +8564,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -8515,9 +8573,9 @@ snapshots: jest-util@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 chalk: 4.1.2 - ci-info: 4.0.0 + ci-info: 4.1.0 graceful-fs: 4.2.11 picomatch: 4.0.2 @@ -8534,7 +8592,7 @@ snapshots: dependencies: '@jest/test-result': 30.0.0-alpha.6 '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.14 + '@types/node': 20.17.16 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -8543,25 +8601,25 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.0-alpha.6: dependencies: - '@types/node': 20.17.14 + '@types/node': 20.17.16 '@ungap/structured-clone': 1.2.0 jest-util: 30.0.0-alpha.6 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)): + jest@30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)): dependencies: - '@jest/core': 30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + '@jest/core': 30.0.0-alpha.6(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) '@jest/types': 30.0.0-alpha.6 import-local: 3.1.0 - jest-cli: 30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + jest-cli: 30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8656,15 +8714,15 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.12(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.79.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0): + langchain@0.3.13(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))(axios@1.7.9)(cheerio@1.0.0)(handlebars@4.7.8)(openai@4.80.1(ws@8.18.0)(zod@3.24.1))(ws@8.18.0): dependencies: - '@langchain/core': 0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) - '@langchain/openai': 0.3.17(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1)))(ws@8.18.0) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.33(openai@4.79.1(ws@8.18.0)(zod@3.24.1))) + '@langchain/core': 0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) + '@langchain/openai': 0.4.2(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1)))(ws@8.18.0) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.36(openai@4.80.1(ws@8.18.0)(zod@3.24.1))) js-tiktoken: 1.0.16 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.3.0(openai@4.79.1(ws@8.18.0)(zod@3.24.1)) + langsmith: 0.3.3(openai@4.80.1(ws@8.18.0)(zod@3.24.1)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 @@ -8680,19 +8738,7 @@ snapshots: - openai - ws - langsmith@0.3.0(openai@4.79.1(ws@8.18.0)(zod@3.24.1)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.12.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.6.3 - uuid: 10.0.0 - optionalDependencies: - openai: 4.79.1(ws@8.18.0)(zod@3.24.1) - - langsmith@0.3.2(openai@4.79.1(ws@8.18.0)(zod@3.24.1)): + langsmith@0.3.3(openai@4.80.1(ws@8.18.0)(zod@3.24.1)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -8702,7 +8748,7 @@ snapshots: semver: 7.6.3 uuid: 10.0.0 optionalDependencies: - openai: 4.79.1(ws@8.18.0)(zod@3.24.1) + openai: 4.80.1(ws@8.18.0)(zod@3.24.1) leven@3.1.0: {} @@ -8914,13 +8960,11 @@ snapshots: neo-async@2.6.2: {} - nock@13.5.6: + nock@14.0.0: dependencies: - debug: 4.3.7 + '@mswjs/interceptors': 0.37.5 json-stringify-safe: 5.0.1 propagate: 2.0.1 - transitivePeerDependencies: - - supports-color node-abi@3.71.0: dependencies: @@ -9066,9 +9110,9 @@ snapshots: dependencies: mimic-fn: 2.1.0 - openai@4.79.1(ws@8.18.0)(zod@3.24.1): + openai@4.80.1(ws@8.18.0)(zod@3.24.1): dependencies: - '@types/node': 18.19.71 + '@types/node': 18.19.74 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.6.0 @@ -9110,6 +9154,8 @@ snapshots: outdent@0.5.0: {} + outvariant@1.4.3: {} + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -9152,7 +9198,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.0: {} + package-manager-detector@0.2.8: {} parent-module@1.0.1: dependencies: @@ -9212,7 +9258,7 @@ snapshots: path-type@4.0.0: {} - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -9241,7 +9287,7 @@ snapshots: postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prebuild-install@7.1.2: @@ -9649,6 +9695,8 @@ snapshots: statuses@2.0.1: {} + strict-event-emitter@0.5.1: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -9845,12 +9893,12 @@ snapshots: dependencies: typescript: 5.7.3 - ts-jest@29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 30.0.0-alpha.6(@types/node@20.17.14)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3)) + jest: 30.0.0-alpha.6(@types/node@20.17.16)(ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -9863,14 +9911,14 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3): + ts-node@10.9.2(@types/node@20.17.16)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.14 + '@types/node': 20.17.16 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -9996,12 +10044,12 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.9 - typescript-eslint@8.18.1(eslint@9.18.0)(typescript@5.7.3): + typescript-eslint@8.18.1(eslint@9.19.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.18.1(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.18.1(eslint@9.19.0)(typescript@5.7.3) + eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -10022,7 +10070,7 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.19.6: {} + undici-types@6.19.8: {} undici@6.21.1: optional: true @@ -10041,7 +10089,7 @@ snapshots: dependencies: browserslist: 4.23.1 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -10053,6 +10101,8 @@ snapshots: uuid@10.0.0: {} + uuid@11.0.5: {} + v8-compile-cache-lib@3.0.1: {} v8-to-istanbul@9.3.0: diff --git a/sample-code/README.md b/sample-code/README.md index be7426966..a7ec5df33 100644 --- a/sample-code/README.md +++ b/sample-code/README.md @@ -228,11 +228,11 @@ The chain performs RAG with the chat and embedding client. ### Document Grounding -#### E2E flow for Orchestration Grounding +#### E2E flow for Orchestration Grounding using `vector` as the Data Repository -`GET /document-grounding/invoke-orchestration-grounding` +`GET /document-grounding/invoke-orchestration-grounding-vector` -This scenario demonstrates the end-to-end flow for creating collections and documents using the document grounding service, and then using the orchestration grounding to get a chat completion response with a retrieved context. +This scenario demonstrates the end-to-end flow for creating collections and documents using the document grounding service, and then using the orchestration grounding module to get a chat completion response with a retrieved context based on `vector` data repository. The flow will first create an empty collection and then add a document to it. The document contains a statement with the current timestamp. @@ -251,3 +251,14 @@ This scenario demonstrates the end-to-end flow for creating collections and docu The response should contain chunks of documents similar to the query. The created collection will be deleted at the end of the flow. + +#### E2E flow for Orchestration Grounding using `help.sap.com` as the Data Repository + +`GET /document-grounding/invoke-orchestration-grounding-help-sap-com` + +This scenario uses the orchestration grounding module to get a chat completion response with a retrieved context based on `help.sap.com` data repository. + +Orchestration service will send a chat completion request with the context to LLM. +The response should contain the same timestamp. + +The created collection will be deleted at the end of the flow. diff --git a/sample-code/package.json b/sample-code/package.json index 325412d16..1a801869e 100644 --- a/sample-code/package.json +++ b/sample-code/package.json @@ -28,8 +28,8 @@ "@sap-ai-sdk/orchestration": "workspace:^", "@sap-ai-sdk/langchain": "workspace:^", "@sap-ai-sdk/document-grounding": "workspace:^", - "langchain": "0.3.12", - "@langchain/core": "0.3.33", + "langchain": "0.3.13", + "@langchain/core": "0.3.36", "@langchain/textsplitters": "0.1.0", "@sap-cloud-sdk/util": "^3.25.0", "@types/express": "^5.0.0", diff --git a/sample-code/src/ai-api/scenario-api.ts b/sample-code/src/ai-api/scenario-api.ts index c460acafc..dfafb960d 100644 --- a/sample-code/src/ai-api/scenario-api.ts +++ b/sample-code/src/ai-api/scenario-api.ts @@ -24,7 +24,7 @@ export async function getModelsInScenario( scenarioId: string, resourceGroup: string ): Promise { - return ScenarioApi.modelsGet(scenarioId, { + return ScenarioApi.scenarioQueryModels(scenarioId, { 'AI-Resource-Group': resourceGroup }).execute(); } diff --git a/sample-code/src/index.ts b/sample-code/src/index.ts index 5135ea802..d95fb1a5f 100644 --- a/sample-code/src/index.ts +++ b/sample-code/src/index.ts @@ -13,7 +13,8 @@ export { orchestrationRequestConfig, orchestrationCompletionMasking, orchestrationFromJson, - orchestrationGrounding, + orchestrationGroundingVector, + orchestrationGroundingHelpSapCom, orchestrationChatCompletionImage, chatCompletionStreamWithJsonModuleConfig, chatCompletionStream diff --git a/sample-code/src/langchain-azure-openai.ts b/sample-code/src/langchain-azure-openai.ts index ca01d25bb..2dfd764e3 100644 --- a/sample-code/src/langchain-azure-openai.ts +++ b/sample-code/src/langchain-azure-openai.ts @@ -10,6 +10,13 @@ import { import { createStuffDocumentsChain } from 'langchain/chains/combine_documents'; import { MemoryVectorStore } from 'langchain/vectorstores/memory'; import { TextLoader } from 'langchain/document_loaders/fs/text'; +import { + HumanMessage, + SystemMessage, + ToolMessage +} from '@langchain/core/messages'; +import type { BaseMessage } from '@langchain/core/messages'; +import type { AzureOpenAiChatCompletionTool } from '@sap-ai-sdk/foundation-models'; /** * Ask GPT about the capital of France. @@ -32,6 +39,7 @@ export async function invoke(): Promise { // parse the response return parser.invoke(response); } + /** * Ask GPT about the capital of France, as part of a chain. * @returns The answer from ChatGPT. @@ -127,3 +135,74 @@ export async function invokeRagChain(): Promise { context: await retriever.invoke(prompt) }); } + +/** + * Let GPT increase the shareholder value. + * @returns The answer from GPT. + */ +export async function invokeToolChain(): Promise { + // initialize client with options + const client = new AzureOpenAiChatClient({ + modelName: 'gpt-35-turbo', + max_tokens: 1000, + temperature: 0.7 + }); + + // create a tool + const azureTool: AzureOpenAiChatCompletionTool = { + type: 'function', + function: { + name: 'shareholder_value', + description: 'Multiplies the shareholder value', + parameters: { + type: 'object', + properties: { + value: { + type: 'number', + description: 'The value that is supposed to be increased.' + } + }, + required: ['value'] + } + } + }; + + // create a function to increase the shareholder value + function shareholderValueFunction(value: number): string { + return `The shareholder value has been increased to ${value * 2}`; + } + + const humanMessage = new HumanMessage( + 'Increase the shareholder value, it is currently at 10' + ); + + const history: BaseMessage[] = [humanMessage]; + + const response = await client.invoke(history, { tools: [azureTool] }); + + history.push(response); + + if (response.tool_calls) { + const shareholderValue = shareholderValueFunction( + response.tool_calls[0].args.value + ); + + const toolMessage = new ToolMessage({ + content: shareholderValue, + tool_call_id: response.tool_calls[0].id ?? 'default' + }); + + history.push(toolMessage); + } else { + const failMessage = new SystemMessage('No tool calls were made'); + history.push(failMessage); + } + + const finalResponse = await client.invoke(history); + + // create an output parser + const parser = new StringOutputParser(); + + // parse the response + return parser.invoke(finalResponse); +} diff --git a/sample-code/src/media/sample-image.png b/sample-code/src/media/sample-image.png new file mode 100644 index 000000000..ef09b67cd Binary files /dev/null and b/sample-code/src/media/sample-image.png differ diff --git a/sample-code/src/orchestration.ts b/sample-code/src/orchestration.ts index 2112b98ee..72dc3aaa4 100644 --- a/sample-code/src/orchestration.ts +++ b/sample-code/src/orchestration.ts @@ -1,4 +1,6 @@ import { readFile } from 'node:fs/promises'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; import { ContentFilters, OrchestrationClient, @@ -18,6 +20,10 @@ const logger = createLogger({ messageContext: 'orchestration' }); +const __filename = fileURLToPath(import.meta.url); +// Navigate up by one level, to access files in the `sample-code` root instead of the transpiled `dist` folder +const __dirname = join(dirname(__filename), '..'); + /** * A simple LLM request, asking about the capital of France. * @returns The orchestration service response. @@ -296,7 +302,7 @@ export async function orchestrationFromJson(): Promise< > { // You can also provide the JSON configuration as a plain string in the code directly instead. const jsonConfig = await readFile( - './src/model-orchestration-config.json', + join(__dirname, 'src', 'model-orchestration-config.json'), 'utf-8' ); const response = await new OrchestrationClient(jsonConfig).chatCompletion(); @@ -309,7 +315,7 @@ export async function orchestrationFromJson(): Promise< * Ask about a custom knowledge embedded in document grounding. * @returns The orchestration service response. */ -export async function orchestrationGrounding(): Promise { +export async function orchestrationGroundingVector(): Promise { const orchestrationClient = new OrchestrationClient({ llm, templating: { @@ -336,6 +342,41 @@ export async function orchestrationGrounding(): Promise { }); } +/** + * Ask about Generative AI Hub in SAP AI Core and ground the response. + * @returns The orchestration service response. + */ +export async function orchestrationGroundingHelpSapCom(): Promise { + const orchestrationClient = new OrchestrationClient({ + llm, + templating: { + template: [ + { + role: 'user', + content: + 'UserQuestion: {{?groundingRequest}} Context: {{?groundingOutput}}' + } + ] + }, + grounding: buildDocumentGroundingConfig({ + input_params: ['groundingRequest'], + output_param: 'groundingOutput', + filters: [ + { + id: 'filter1', + data_repository_type: 'help.sap.com' + } + ] + }) + }); + + return orchestrationClient.chatCompletion({ + inputParams: { + groundingRequest: 'Give me a short introduction of SAP AI Core.' + } + }); +} + /** * Ask about the image content using a template. * @returns The orchestration service response. @@ -364,10 +405,14 @@ export async function orchestrationChatCompletionImage(): Promise { console.error(error); res .status(500) - .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.message); + .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.request.data); } }); @@ -403,7 +405,7 @@ app.get('/langchain/invoke-chain', async (req, res) => { console.error(error); res .status(500) - .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.message); + .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.request.data); } }); @@ -414,13 +416,24 @@ app.get('/langchain/invoke-rag-chain', async (req, res) => { console.error(error); res .status(500) - .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.message); + .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.request.data); + } +}); + +app.get('/langchain/invoke-tool-chain', async (req, res) => { + try { + res.send(await invokeToolChain()); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.request.data); } }); /* Document Grounding */ app.get( - '/document-grounding/invoke-orchestration-grounding', + '/document-grounding/invoke-orchestration-grounding-vector', async (req, res) => { try { res.setHeader('Content-Type', 'text/event-stream'); @@ -437,7 +450,7 @@ app.get( res.write(`Document created with timestamp:\t${timestamp}\n`); // Send an orchestration chat completion request with grounding module configured. - const groundingResult = await orchestrationGrounding(); + const groundingResult = await orchestrationGroundingVector(); res.write( `Orchestration responded with timestamp:\t${groundingResult.getContent()}\n` ); @@ -509,3 +522,18 @@ app.get('/document-grounding/invoke-retrieve-documents', async (req, res) => { .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.message); } }); + +app.get( + '/document-grounding/invoke-orchestration-grounding-help-sap-com', + async (req, res) => { + try { + const groundingResult = await orchestrationGroundingHelpSapCom(); + res.send(groundingResult.getContent()); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently đŸ˜Ŧ -> ' + error.message); + } + } +); diff --git a/styles/SAP/HeadingAcronyms.yml b/styles/SAP/HeadingAcronyms.yml index 999fbf317..4d9ce6bdf 100644 --- a/styles/SAP/HeadingAcronyms.yml +++ b/styles/SAP/HeadingAcronyms.yml @@ -37,3 +37,4 @@ raw: - (?!ID) - (?!CAP) - (?!CJS) + - (?!RAG) diff --git a/styles/config/vocabularies/SAP/accept.txt b/styles/config/vocabularies/SAP/accept.txt index 5c717847a..4b7f8f254 100644 --- a/styles/config/vocabularies/SAP/accept.txt +++ b/styles/config/vocabularies/SAP/accept.txt @@ -109,7 +109,7 @@ polyfill URIs [Dd]estructure [Dd]estructuring -config +[Cc]onfig Injectable uncheck [kK]eystore diff --git a/tests/e2e-tests/src/document-grounding.test.ts b/tests/e2e-tests/src/document-grounding.test.ts index 2f0b5bf63..b7a64a78e 100644 --- a/tests/e2e-tests/src/document-grounding.test.ts +++ b/tests/e2e-tests/src/document-grounding.test.ts @@ -2,7 +2,8 @@ import { createCollection, createDocumentsWithTimestamp, deleteCollection, - orchestrationGrounding + orchestrationGroundingHelpSapCom, + orchestrationGroundingVector } from '@sap-ai-sdk/sample-code'; import { loadEnv } from './utils/load-env.js'; @@ -22,8 +23,15 @@ describe('document grounding', () => { await deleteCollection(collectionId); }); - it('should get the result based on grounding context via orchestration API', async () => { - const result = await orchestrationGrounding(); + it('should get the result based on grounding context from vector data repository via orchestration API', async () => { + const result = await orchestrationGroundingVector(); expect(result.getContent()).toEqual(timestamp.toString()); }); + + it('should get the result based on grounding context from `help.sap.com` data respository via orchestration API', async () => { + const result = await orchestrationGroundingHelpSapCom(); + expect(result.getContent()).toEqual(expect.any(String)); + expect(result.data.module_results).toBeDefined(); + expect(result.data.module_results.grounding!.data).toBeDefined(); + }); }); diff --git a/tests/smoke-tests/package.json b/tests/smoke-tests/package.json index c8cd17701..8e35dca30 100644 --- a/tests/smoke-tests/package.json +++ b/tests/smoke-tests/package.json @@ -18,8 +18,8 @@ "node": "^20" }, "dependencies": { - "langchain": "0.3.12", - "@langchain/core": "0.3.33", + "langchain": "0.3.13", + "@langchain/core": "0.3.36", "@langchain/textsplitters": "0.1.0", "@sap-ai-sdk/ai-api": "canary", "@sap-ai-sdk/foundation-models": "canary",